#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
char str[1000010];
int next[1000010];
int get_next(int len)
{
next[0]=-1;
int i=0,k=-1;
while(i<len)
{
if(k==-1||str[i]==str[k])
{
i++;
k++;
next[i]=k;
}
else k=next[k];
}
return 0;
}
int main()
{
int n,j,i,d=1;
while(scanf("%d",&n),n)
{
scanf("%s",str);
printf("Test case #%d\n",d++);
get_next(n);
for(i=2;i<=n;i++)
{
int t=i-next[i];
if(i%t==0&&t!=i) printf("%d %d\n",i,i/t);
}
printf("\n");
}
}
poj 1961 KMP运用之循环节的问题
最新推荐文章于 2018-08-23 20:23:30 发布