exKMP
核心思想: 从已知信息扩展。
以下记 为 在 这一部分的子串。
Border:定义为 的公共前后缀。例: 的 border 是 。
Z函数: 。想要求解 。
对于所有的 , 找到 ,设 是这个最大值的下标 。目前匹配到的最大下标 就是 。 这里没有包含 是因为 。 根据上述,我们可以得到 。
进行推导,若 ,有 ,否则,从 进行枚举。
void Z(char *s,int n){
z[1]=n;
for(int i=2,l=0,r=0;i<=n;i++){
//r是目前往右扩展到的位置 l是(j+z[j])最大的j
if(i<=r)z[i]=min(z[i-l+1],r-i+1);
while(i+z[i]<= n and s[i+z[i]]==s[z[i]+1])z[i]++;
if(i+z[i]-1>r)l=i,r=i+z[i]-1;
}
}