题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358
题目大意:给定字符串S,对于每个i(2<=i<=N),求最大的K值使A^K==S前i个字符,A^K为字符串A重复K次(只输出K>1的情况)
利用next数组可求出每个前缀的K值,详见:http://blog.youkuaiyun.com/f_xuan/article/details/38763127
#include<cstdio>
#include<cstring>
char str[1000100];
int next[1000100];
void get_next(int len){
int i=0,j=-1;
next[0]=-1;
while(i<len){
if(j==-1||str[i]==str[j]){
i++,j++;
next[i]=j;
}else
j=next[j];
}
}
int main(){
int i,ans,len;
int cas=1;
while(~scanf("%d",&len)&&len){
scanf("%s",str);
get_next(len);
printf("Test case #%d\n",cas++);
for(i=2;i<=len;++i){
if((i%(i-next[i])==0)&&i/(i-next[i])>1){
printf("%d %d\n",i,i/(i-next[i]));
}
}
printf("\n");
}
return 0;
}