题目链接:http://poj.org/problem?id=1961
对每个前缀i,若能由某些字符重复k次形成,输出最大的k。
与上题类似,枚举i,若i%(i-f[i])==0 则最短循环节为i-f[i],k为i/(i-f[i])
/*
当 n%(n-f[n])==0时,n-f[n] 是s最短的循环节。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[1000005];
int next[1000005];
void getnext(char *s,int *next){
int len=strlen(s);
next[0]=-1;
int i=0,j=-1;
while(i<len){
if(j==-1 || s[i]==s[j]){
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
int main(){
int size;
int count=0;
while(scanf("%d",&size)!=EOF && size){
scanf("%s",s);
printf("Test case #%d\n",++count);
getnext(s,next);
int len=strlen(s);
for(int i=2;i<=len;i++){
if(next[i]>0 && i%(i-next[i])==0)
printf("%d %d\n",i,i/(i-next[i]));
}
printf("\n");
}
}