重新记录一个板子
- 字符串下标从开始(也可以很容易得改成从开始)
- 数组的不是良定义的,默认为;如果有必要,可以在的最后进行的修改
- 表示右端点最靠右的已匹配串
- 求数组的关键在于尽可能利用已求出的数组值
char s[maxn];
int z[maxn];
void getZ() {
int n=strlen(s);
for(int i=1, j=0; i<n; ++i) {
if(i<j+z[j]) z[i]=min(j+z[j]-i,z[i-j]);
while(i+z[i]<n&&s[z[i]]==s[i+z[i]]) z[i]++;
if(i+z[i]>j+z[j]) j=i;
}
}