Z algorithm
Z函数也叫扩展KMP算法,因为思路和KMP很像,都是从已经获得的信息中处理后面的信息。
思路参考:
灵茶山艾府-Z函数 (听了这个才听懂)
OI WIKI
算法demo程序
模板:
vector<int> zf(string s)
{
int len = s.size();
vector<int> z(len);
z[0] = len;
int i = 1,l = 0,r = 0;
for(;i < len;i ++)
{
if(i <= r && z[i - l] < r - i + 1) //如果能用之前的信息更新现在点i的信息,i + z[i]不能超过z-box的右端点
{
z[i] = z[i - l];
}else //如果i + z[i]超过了z-box的右端点或者z[i - 1] == r - i + 1,就是i + z[i - l]刚刚好到r,后面是否匹配未知要开始暴力匹配
{
z[i] = max(0,r - i + 1);
while(i + z[i] < len && s[z[i]] == s[i + z[i]]) {
z[i] ++;
}
}
if(i + z[i] - 1 > r) //新匹配的子串长度大于z-box,更新z-box
{
l = i,r = i + z[i] - 1;
}
}
return z;
}

浙公网安备 33010602011771号