http://acm.hdu.edu.cn/showproblem.php?pid=1358
题目大意:给出一个长度为 n 的字符串,求该字符串的循环前缀的长度,和循环次数;
示例:abababab
前4个字符,循环字串为ab,有2个循环周期 ab|ab
前6个字符,循环字串为ab,有3个循环周期 ab|ab|ab
前8个字符,循环字串为ab,有4个循环周期 ab|ab|ab|ab
输出:
4 2
6 3
8 4
#include<stdio.h>
#define SIZE 1000006
int next[SIZE];
char str[SIZE];
void getnext(int n)
{
int i=0,j=-1;
next[0]=-1;
while(i<n){
if(j==-1 || str[i]==str[j]){
i++;
j++;
next[i] = j;
}
else{
j = next[j];
}
}
}
int main()
{
int nT=1,n,i,mixed,circulate;
while(scanf("%d",&n),n){
getchar();
gets(str);
getnext(n);
printf("Test case #%d\n",nT++);
for(i=1;i<=n;i++){
mixed = 2*next[i]-i; //重叠部分
circulate = next[i]-mixed; //循环节长度
if(mixed>=0 && i%circulate==0){
printf("%d %d\n",i,i/circulate);
}
}
printf("\n");
}
return 0;
}