求整个串和每个后缀的最长公共前缀,复杂度线性。代码如下:
for(int i=2;i<=cnt;i++){ if(p+z[p]>i)z[i]=min(z[i-p+1],p+z[p]-i); while(c[z[i]+1]==c[i+z[i]])z[i]++; if(i+z[i]>p+z[p])p=i; }