Skip to content

Commit 9f834a9

Browse files
authored
Update suffix_array_short.hpp
1 parent ed8ee91 commit 9f834a9

File tree

1 file changed

+17
-17
lines changed

1 file changed

+17
-17
lines changed

library/strings/suffix_array/suffix_array_short.hpp

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,32 +11,32 @@
1111
//! @time O(n * log^2(n))
1212
//! @space O(n)
1313
auto sa_short(const auto& s) {
14-
const int K = 4;
15-
int n = sz(s);
14+
const int n = sz(s), K = 4;
1615
vi sa(n), sa_inv(all(s)), lcp(n - 1);
1716
iota(all(sa), 0);
1817
for (int j = 1; j <= n; j *= K) {
19-
vi x(sa_inv);
20-
auto proj = [&](int i) {
18+
vi x(sa_inv), y(lcp);
19+
auto f = [&](int i) {
2120
array<int, K> res;
2221
rep (k, 0, K)
2322
res[k] = i + j * k < n ? x[i + j * k] : -1;
2423
return res;
25-
//return pair(x[i], i + j < n ? x[i + j] : -1);
2624
};
27-
ranges::sort(sa, {}, proj);
25+
ranges::sort(sa, {}, f);
2826
sa_inv[sa[0]] = 0;
29-
rep(i, 1, n) sa_inv[sa[i]] =
30-
sa_inv[sa[i - 1]] + (proj(sa[i - 1]) != proj(sa[i]));
31-
}
32-
int sz = 0;
33-
rep(i, 0, n) {
34-
if (sz > 0) sz--;
35-
if (sa_inv[i] == 0) continue;
36-
for (int j = sa[sa_inv[i] - 1];
37-
max(i, j) + sz < n && s[i + sz] == s[j + sz];)
38-
sz++;
39-
lcp[sa_inv[i] - 1] = sz;
27+
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]]++;
31+
rep (k, 0, K) {
32+
if (f(sa[i + 1])[k] != f(sa[i])[k]) {
33+
lcp[i] = j * k + (i + j * k < n ? y[i + j * k] : 0);
34+
}
35+
}
36+
} else {
37+
lcp[i] = j * K;
38+
}
39+
}
4040
}
4141
return tuple{sa, sa_inv, lcp};
4242
}

0 commit comments

Comments
 (0)