Skip to content

Commit 8fd2384

Browse files
committed
fix
1 parent 9a72891 commit 8fd2384

File tree

1 file changed

+15
-16
lines changed

1 file changed

+15
-16
lines changed

library/strings/suffix_array/suffix_array_short.hpp

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,36 +7,35 @@
77
//! vi s_vec;
88
//! auto [sa1, sa_inv1, lcp1] = sa_short(s_vec);
99
//! @endcode
10-
//! runs in ~1.5s for 5e5
10+
//! runs in ~0.5s for 5e5
1111
//! @time O(n * log^2(n))
1212
//! @space O(n)
1313
auto sa_short(const auto& s) {
14-
const int n = sz(s), K = 4;
14+
const int n = sz(s), K = 6;
1515
vi sa(n), sa_inv(all(s)), lcp(n - 1);
1616
iota(all(sa), 0);
1717
for (int j = 1; j <= n; j *= K) {
18-
vi x(sa_inv), y(n, -1);
19-
rep (i, 0, n - 1) y[sa[i]] = lcp[i];
20-
int val;
18+
vi x(sa_inv);
2119
auto cmp = [&](int i1, int i2) {
22-
val = 0;
2320
rep (k, 0, K) {
2421
int a = i1 + j * k < n ? x[i1 + j * k] : -1;
2522
int b = i2 + j * k < n ? x[i2 + j * k] : -1;
26-
if (a != b) {
27-
if (a != -1) val += y[i1 + j * k];
28-
return a < b;
29-
}
30-
val += j;
23+
if (a != b) return a < b;
3124
}
3225
return false;
3326
};
34-
ranges::sort(sa, cmp);
27+
sort(all(sa), cmp);
3528
sa_inv[sa[0]] = 0;
36-
rep(i, 0, n - 1) {
37-
sa_inv[sa[i + 1]] = sa_inv[sa[i]] + cmp(sa[i], sa[i + 1]);
38-
lcp[i] = val;
39-
}
29+
rep(i, 1, n)
30+
sa_inv[sa[i]] = sa_inv[sa[i - 1]] + cmp(sa[i - 1], 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+
int j = sa[sa_inv[i] - 1];
37+
while(max(i, j) + sz < n && s[i + sz] == s[j + sz];) sz++;
38+
lcp[sa_inv[i] - 1] = sz;
4039
}
4140
return tuple{sa, sa_inv, lcp};
4241
}

0 commit comments

Comments
 (0)