题解:对于串pattern来说,如果0~i-1这个位置中循环,那么i%(i-next[i])==0 ,循环次数为 i/(i-next[i]),循环长度为 i-next[i]
例如对于串ababab来说
index 0 1 2 3 4 5
char a b a b a b
next -1 0 0 1 2 1
对于index=4时,i%(i-next[i])==0,而0~3位置的字符存循环。
代码:
#include#include #include int N,next[1000001];char pattern[1000001];//用于存放模式串void getNext()//求next数组的模板{ next[0]=-1; int k=-1,j=0; while(j 1){ printf("%d %d\n",i,i/n); } } return;//记得得回溯} int main(){ int cnt=0; while(~scanf("%d",&N),N){ getchar(); memset(next,0,sizeof(next)); gets(pattern); getNext(); printf("Test case #%d\n",++cnt); solve(); printf("\n"); } return 0;} //关于solve()函数的详细解析请参考大牛的博客,