z[i]表示以i位置的子串前缀和原字符串前缀最大匹配个数
void z_function(){
int l=0,r=0;
for(int i=1;i<n;++i){
if(i<=r)
z[i]=min(r-i+1,z[i-l]);
while(i+z[i]<n&&s[i+z[i]]==s[z[i]]) ++z[i];
if(z[i]+i-1>r) l=i,r=z[i]+i-1;
}
}
z[i]表示以i位置的子串前缀和原字符串前缀最大匹配个数
void z_function(){
int l=0,r=0;
for(int i=1;i<n;++i){
if(i<=r)
z[i]=min(r-i+1,z[i-l]);
while(i+z[i]<n&&s[i+z[i]]==s[z[i]]) ++z[i];
if(z[i]+i-1>r) l=i,r=z[i]+i-1;
}
}