枚举长度判断是否符合周期串,用next判断
#include<cstring>
#include<cstdio>
using namespace std;
#define MAXN 1000005
int next[MAXN];
char s[MAXN],p[MAXN];
void getnext(int n)
{
for(int i=1;i<n;i++)
{
int j=next[i];
while(j&&p[i]!=p[j])
{
j=next[j];
}
if(p[i]==p[j])
{
next[i+1]=j+1;
}
else
{
next[i+1]=0;
}
}
}
int main()
{
int cas=1,n;
while(scanf("%d",&n)&&n)
{
scanf("%s",p);
getnext(n);
printf("Test case #%d\n",cas++);
for(int i=2;i<=n;i++)
{
if(next[i]&&i%(i-next[i])==0)
printf("%d %d\n",i,i/(i-next[i]));
}
putchar(10);
}
return 0;
}