这题也想了很久,智商捉急。求相同前缀和后缀在串中出现了多少次,用num数组表示出现了多少次,由于next数组树的性质,
而且一定保证越后面的深度约大,所以先把num数组全赋值为1,然后再从后往前扫,num[nxt[i]]+=num[i]
#include<cstdio>
#include<cstring>
#define maxl 1000020
int n,tlen,cnt;
int nxt[maxl],num[maxl],ans[maxl],ansnum[maxl];
char t[maxl];
bool yes,vis[maxl];
void getnxt()
{
int j=0;nxt[1]=0;
tlen=strlen(t+1);
for(int i=2;i<=tlen;i++)
{
while(j && t[i]!=t[j+1])
j=nxt[j];
if(t[i]==t[j+1])
j++;
nxt[i]=j;
}
}
void prework()
{
scanf("%s",t+1);
}
void mainwork()
{
getnxt();yes=false;
for(int i=1;i<=tlen;i++)
num[i]=1;
for(int i=tlen;i>=1;i--)
num[nxt[i]]+=num[i];
cnt=1;ans[1]=tlen;ansnum[1]=1;
for(int i=nxt[tlen];i;i=nxt[i])
cnt++,ans[cnt]=i,ansnum[cnt]=num[i];
}
void print()
{
printf("%d\n",cnt);
for(int i=cnt;i>=1;i--)
printf("%d %d\n",ans[i],ansnum[i]);
}
int main()
{
prework();
mainwork();
print();
return 0;
}