Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void build() {
- for (int i = 0; i < N; i++) { sa[i] = i; key[i] = text[i]; }
- sort(sa, sa+N, Cmp());
- for (int K = 1; ; K *= 2) {
- for (int i = 0; i < N; i++)
- ranku[sa[i]] = i>0 && key[sa[i-1]]==key[sa[i]] ? ranku[sa[i-1]] : i;
- if (K >= N) break;
- for (int i = 0; i < N; i++)
- key[i] = ranku[i] * (N+1LL) + (i+K < N ? ranku[i+K]+1 : 0);
- sort(sa, sa+N, Cmp());
- }
- for (int i = 0, k = 0; i < N; i++) {
- if (k > 0) k--;
- if (ranku[i] == N-1) { lcp[N-1] = -1; k = 0; continue; }
- int j = sa[ranku[i]+1];
- while (text[i+k] == text[j+k]) k++;
- lcp[ranku[i]] = k;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement