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;
	
}
posted @ 2024-09-06 12:53  chhh31  阅读(35)  评论(0)    收藏  举报