void construct_lcp_kasai(cache_config& config) { int_vector<> lcp; typedef int_vector<>::size_type size_type; construct_isa(config); { int_vector<t_width> text; if (!load_from_cache(text, key_text_trait<t_width>::KEY_TEXT, config)) { return; } int_vector_file_buffer<> isa_buf(config.file_map[constants::KEY_ISA], 1000000); // init isa file_buffer int_vector<> sa; if (!load_from_cache(sa, constants::KEY_SA, config)) { return; } // use Kasai algorithm to compute the lcp values for (size_type i=0,j=0,sa_1=0,l=0, r_sum=0, r=isa_buf.load_next_block(), n=isa_buf.int_vector_size; r_sum < n;) { for (; i < r_sum+r; ++i) { sa_1 = isa_buf[i-r_sum]; // = isa[i] if (sa_1) { j = sa[sa_1-1]; if (l) --l; assert(i!=j); while (text[i+l]==text[j+l]) { // i+l < n and j+l < n are not necessary, since text[n]=0 and text[i]!=0 (i<n) and i!=j ++l; } sa[ sa_1-1 ] = l; //overwrite sa array with lcp values } else { l = 0; sa[ n-1 ] = 0; } } r_sum += r; r = isa_buf.load_next_block(); } for (size_type i=sa.size(); i>1; --i) { sa[i-1] = sa[i-2]; } sa[0] = 0; lcp.swap(sa); } store_to_cache(lcp, constants::KEY_LCP, config); }
void construct_lcp_kasai(cache_config& config) { static_assert(t_width == 0 or t_width == 8 , "construct_lcp_kasai: width must be `0` for integer alphabet and `8` for byte alphabet"); int_vector<> lcp; typedef int_vector<>::size_type size_type; construct_isa(config); { int_vector<t_width> text; if (!load_from_cache(text, key_text_trait<t_width>::KEY_TEXT, config)) { return; } int_vector_buffer<> isa_buf(config.file_map[conf::KEY_ISA], std::ios::in, 1000000); // init isa file_buffer int_vector<> sa; if (!load_from_cache(sa, conf::KEY_SA, config)) { return; } // use Kasai algorithm to compute the lcp values for (size_type i=0,j=0,sa_1=0,l=0, n=isa_buf.size(); i < n; ++i) { sa_1 = isa_buf[i]; // = isa[i] if (sa_1) { j = sa[sa_1-1]; if (l) --l; assert(i!=j); while (text[i+l]==text[j+l]) { // i+l < n and j+l < n are not necessary, since text[n]=0 and text[i]!=0 (i<n) and i!=j ++l; } sa[ sa_1-1 ] = l; //overwrite sa array with lcp values } else { l = 0; sa[ n-1 ] = 0; } } for (size_type i=sa.size(); i>1; --i) { sa[i-1] = sa[i-2]; } sa[0] = 0; lcp.swap(sa); } store_to_cache(lcp, conf::KEY_LCP, config); }