/*
分析:
KMP基础题。
对next的理解更深入了点儿。
字符编号从0开始,那么if(i%(i-next[i])==0),则i前面的
串为一个轮回串,其中轮回子串出现i/(i-next[i])次。
想了快半个小时,终于想明白了TT,咱还是太水了囧~
2012-09-13
*/
分析:
KMP基础题。
对next的理解更深入了点儿。
字符编号从0开始,那么if(i%(i-next[i])==0),则i前面的
串为一个轮回串,其中轮回子串出现i/(i-next[i])次。
想了快半个小时,终于想明白了TT,咱还是太水了囧~
2012-09-13
*/
#include"stdio.h"
#include"string.h"
char str[1000111];
int next[1000111];
void getnext()
{
int j,k;
memset(next,0,sizeof(next));
j=0;
k=-1;
next[0]=-1;
while(str[j])
{
if(k==-1 || str[j]==str[k]) next[++j]=++k;
else k=next[k];
}
}
void KMP()
{
int i;
int t;
for(i=2;str[i-1];i++)
{
t=i-next[i];
if(i%t==0 && i/t>1) printf("%d %d\n",i,i/t);
}
}
int main()
{
int Case=1;
int n;
while(scanf("%d",&n),n)
{
scanf("%s",str);
printf("Test case #%d\n",Case++);
getnext();
KMP();
printf("\n");
}
return 0;
}