0%

z函数_扩展kmp

z函数(扩展kmp)

对于一个长度为 n 的字符串 s,定义函数 z[i] 表示 s 和 s[i,n-1](即以s[i] 开头的后缀) 的最长公共前缀(LCP) ,则 z 被称为 s 的 z 函数。特别的,z[0] = 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vector<int> z_function(string s) {
int n = (int)s.length();
vector<int> z(n);
for (int i = 1, l = 0, r = 0; i < n; ++i) {
if (i <= r && z[i - l] < r - i + 1) {
z[i] = z[i - l];
} else {
z[i] = max(0, r - i + 1);
while (i + z[i] < n && s[z[i]] == s[i + z[i]]) ++z[i];
}
if (i + z[i] - 1 > r) l = i, r = i + z[i] - 1;
}
return z;
}

字符串整周期

给定一个长度为 n 的字符串 s,找到其最短的整周期,即寻找一个最短的字符串 t ,使得 s 可以被若干个 t 拼接而成的字符串表示。

考虑计算 s 的 Z 函数,则其整周期的长度为最小的 n 的因数 i ,满足 i + z[i] = n。