【字符串】Z函数 - 模板
z [ i ] z[i] z[i] 表示字符串 s s s 和 s [ i , n − 1 ] s[i,\ n - 1] s[i, n−1] 的最长前缀的长度,特别的, z [ 0 ] = 0 z[0]=0 z[0]=0
// *********Z函数**************
// - 时间复杂度 O(n)
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;
}