扩展 KMP(Z 函数)

变量

  • int z[i]\texttt{int z[i]}SinS_{i\sim n}SS 的最长公共前缀的长度。

函数

  • void getz(string s)\texttt{void getz(string s)}:得到字符串 sszz 函数值。

代码

int z[N];
void getz(string s){
	int len=s.size(),l=0;
    z[0]=0;
	for(int i=1;i<len;i++){
		z[i]=0;
		if(l+z[l]>i)
			z[i]=min(l+z[l]-i,z[i-l]);
		while(i+z[i]<len&&s[z[i]]==s[i+z[i]])
			z[i]++;
		if(i+z[i]>l+z[l])
			l=i;
	}
	z[0]=len; 
}
posted @ 2022-08-11 23:51  luckydrawbox  阅读(21)  评论(0)    收藏  举报  来源