题解 CF432D 【Prefixes and Suffixes】
Z-function (因该首先想到的不是它吧)
#include<bits/stdc++.h>
using namespace std;
char s[111111];
int l,r,i,j,k,cnt,n,z[111111],ans[111111];
pair<int,int> res[111111];
int main(){
scanf("%s",s);
n=strlen(s);
l=0,r=0,z[0]=n;
for(i=1;i<n;++i){ //计算出所有的z的值
if(i>r){
j=0;
while(s[j]==s[i+j]) ++j;
l=i,r=i+j-1,z[i]=j;
}else{
k=i-l;
if(z[k]<r-i+1) z[i]=z[k];
else{
j=r;
while(s[j]==s[j-i]) ++j;
l=i,r=j-1,z[i]=r-l+1;
}
}
}
for(i=0;i<n;++i) ++ans[z[i]]; //统计个数
for(i=n-1;i;--i) ans[i]+=ans[i+1];
for(i=0;i<n;++i) if(i+z[i]==n) res[++cnt]=make_pair(z[i],ans[z[i]]);
sort(res+1,res+cnt+1); //按照要求排个序
printf("%d\n",cnt);
for(i=1;i<=cnt;++i) printf("%d %d\n",res[i].first,res[i].second);
return 0;
}