File tree Expand file tree Collapse file tree 1 file changed +13
-18
lines changed
library/strings/suffix_array Expand file tree Collapse file tree 1 file changed +13
-18
lines changed Original file line number Diff line number Diff line change @@ -16,27 +16,22 @@ auto sa_short(const auto& s) {
1616 iota (all (sa), 0 );
1717 for (int j = 1 ; j <= n; j *= K) {
1818 vi x (sa_inv), y (lcp);
19- auto f = [&](int i) {
20- array<int , K> res;
21- rep (k, 0 , K)
22- res[k] = i + j * k < n ? x[i + j * k] : -1 ;
23- return res;
19+ int val;
20+ auto cmp = [&](int i1, int i2) {
21+ val = 0 ;
22+ rep (k, 0 , K) {
23+ int a = i1 + j * k < n ? x[i1 + j * k] : -1 ;
24+ int b = i2 + j * k < n ? x[i2 + j * k] : -1 ;
25+ if (a != b) return val += y[b], a < b;
26+ val += j;
27+ }
28+ return false ;
2429 };
25- ranges::sort (sa, {}, f );
30+ ranges::sort (sa, cmp );
2631 sa_inv[sa[0 ]] = 0 ;
2732 rep (i, 0 , n - 1 ) {
28- sa_inv[sa[i + 1 ]] = sa_inv[sa[i]];
29- if (f (sa[i + 1 ]) != f (sa[i])) {
30- sa_inv[sa[i + 1 ]]++;
31- rep (k, 0 , K) {
32- if (f (sa[i + 1 ])[k] != f (sa[i])[k]) {
33- lcp[i] = j * k + (sa[i] + j * k < n ? y[x[sa[i] + j * k]] : 0 );
34- break ;
35- }
36- }
37- } else {
38- lcp[i] = min ({j * K, n - sa[i], n - sa[i + 1 ]});
39- }
33+ sa_inv[sa[i + 1 ]] = sa_inv[sa[i]] + cmp (sa[i], sa[i + 1 ]);
34+ lcp[i] = val;
4035 }
4136 }
4237 return tuple{sa, sa_inv, lcp};
You can’t perform that action at this time.
0 commit comments