void getZBox(string s) {
int n = s.size();
vector<int> z(n);
int l = 0, r = 0;
//z[0] = 0
//z[i - 1] == s[l-r]
//求z[i]
/*
1.l <= i <= r
s[i-r] == s[i - l,r - l] == z[i - l]
2.i > r
*/
for (int i = 1; i < n; i++) {
if (i <= r) {
z[i] = min(z[i - l], r - i + 1);
}
while (i + z[i] < n && s[z[i]] == s[i + z[i]]) {
l = i;
r = i + z[i];
z[i]++;
}
}
}
扩展kmp
于 2024-04-06 18:03:35 首次发布