void NSV::create_last_level(LCP *lcp, TextIndex *csa) { uint *lcp_r; uint lcp_value, nsv_aux, j; /*store the results for the last level*/ uint num_elements = R[r-1]->rank1(n-1); b_A = bits(num_elements); A = new uint[(num_elements*b_A + W -1)/W]; for(size_t i=0; i<((num_elements*b_A + W -1)/W); i++) A[i]=0; lcp_r = new uint[num_elements]; for(uint i=0; i<num_elements; i++) { lcp_r[i] = lcp->get_LCP(R[r-1]->select1(i+1), csa); } for(uint i=0; i<num_elements; i++) { lcp_value = lcp_r[i]; for(j=i+1; j<num_elements; j++) { nsv_aux = lcp_r[j]; if(lcp_value > nsv_aux) { set_field_64(A, b_A, i, j); break; } } /*close for j*/ if(j==num_elements) set_field_64(A, b_A, i, j); } /*close for i*/ delete [] lcp_r; }
void PSV::create_last_level(LCP *lcp, TextIndex *csa) { size_t *lcp_r; uint lcp_value, psv_aux; int j, ini=0; /*store the results for the last level*/ uint num_elements = R[r-1]->rank1(n); b_A = bits(num_elements); A = new uint[(num_elements*b_A + W -1)/W]; for(size_t i=0; i<((num_elements*b_A + W -1)/W); i++) A[i]=0; lcp_r = new size_t[num_elements]; if(R[r-1]->access(0)) ini = 1; for(uint i=ini; i<num_elements; i++) { lcp_r[i] = lcp->get_LCP(R[r-1]->select1(i+1)-1, csa); } for(int i=num_elements-1; i>0; i--) { lcp_value = lcp_r[i]; for(j=i-1; j>0; j--) { psv_aux = lcp_r[j]; if(lcp_value > psv_aux) { set_field_64(A, b_A, i, j); break; } } /*close for j*/ if(j==0) { if(ini) set_field_64(A, b_A, i, 0); else { psv_aux = lcp_r[j]; if(lcp_value > psv_aux) set_field_64(A, b_A, i, j); else set_field_64(A, b_A, i, 0); } } } /*close for i*/ set_field_64(A, b_A, 0, 0); delete [] lcp_r; }
LCP_naive::LCP_naive(TextIndex *csa, char *text, size_t n) { length =n; size_t prev, act, val; b = bits(length-1); long long nb = 1; nb = (nb*b*n+W-1)/W; if(nb > MAXINT) { cout << "Memory limit excess (in LCP)" << endl; exit(1); } lcp_array = new uint[(size_t)nb]; for(size_t i=0; i<(size_t)nb; i++) lcp_array[i]=0; set_field_64(lcp_array, b, 0, 0); val = csa->getSA(0); prev = n - val; for(size_t i=1; i < length; i++) { val = csa->getSA(i); act = n - val; set_field_64(lcp_array, b, i, lcp_length(text, n-prev, val, min(prev,act))); prev = act; } }