next数组中的j本质上维护了从距离i最近的上一个重复串中与i对应的位置
因此如果i % (i - j) == 0 && i / (i - j ) > 1则这个刚好扫描到了重复的串
#include<stdio.h>
char pattern[1000002];
int nextp[1000002];
int tl;
void failF()
{
int k=-1;int j=0;
nextp[0]=-1;
while(j<tl)
{
if(k==-1||pattern[k]==pattern[j])
{
k++;j++;
if(j%(j-k)==0&&j/(j-k)>1)
printf("%d %d\n",j,j/(j-k));
nextp[j]=k;
}
else
{
k=nextp[k];
}
}
}
int turn=0;
int main()
{
scanf("%d",&tl);
while(tl!=0)
{
char in;
for(int i=0;i<tl;)
{
scanf("%c",&in);
if(in>=97&&in<=126)
{
pattern[i++]=in;
}
}
printf("Test case #%d\n",++turn);
failF() ;
putchar(10);
scanf("%d",&tl);
}
return 0;
}