Skip to content

Commit 4534728

Browse files
authored
Refactor suffix array sorting and LCP computation
1 parent b2f1c6d commit 4534728

File tree

1 file changed

+13
-18
lines changed

1 file changed

+13
-18
lines changed

library/strings/suffix_array/suffix_array_short.hpp

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff 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};

0 commit comments

Comments
 (0)