blob: dbd5ce5a36ba6ed793a7c5219452a0798a0077f9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
vector<int> Z(const vector<int> &s) {
int n = sz(s);
vector<int> z(n, n);
int l = 0, r = 0, p, q;
for (int i = 1; i < n; ++i) {
if (i <= r && z[i - l] < r - i + 1) {
z[i] = z[i - l];
} else {
if (i > r) p = 0, q = i;
else p = r - i + 1, q = r + 1;
while (q < n && s[p] == s[q]) ++p, ++q;
z[i] = q - i, l = i, r = q - 1;
}}
return z;
}
|