还是找循环节,和hdu3764一样
直接贴码了
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
char s[1000005];
int next[1000005],flag,n;
void getnext(){
int k=1,j=0;
next[k]= 0;
while(k<=n ){
if( j== 0|| s[k]== s[j] ){
++j, ++k;
next[k]= j;
}
else
j= next[j];
}
}
int main()
{
int i,t=0;
while(scanf("%d",&n) && n!=0)
{
printf("Test case #%d\n",++t);
scanf("%s",&s[1]);
getnext();
for(i=3;i<=n+1;i++){
int flag=i-next[i];
if( (i-1)%flag==0 && (i-1)/flag>1)
printf("%d %d\n",i-1,(i-1)/flag);
}
printf("\n");
}
return 0;
}