标签:kmp
#include <stdio.h> #include <string.h> int next[1000005]; void build_next(char str2[]) { int i=0,j=-1; next[0] = -1; while (str2[i]) { if (j==-1 || str2[i] == str2[j]) { i++; j++; // if (str2[i] != str2[j]) // { next[i] = j; //传说中的f[j],储存前缀相同的最长最大值 // } // else // next[i] = next[j]; } else j = next[j]; } } // int KMP(int len1,int len2) // { // build_next(len2); // int i=0,j=0,cnt; // // while (i < len1) // { // if (j==-1 || str1[i] == str2[j]) // { // i++; // j++; // if(j==len2) // return i-len2+1; // } // else // j = next[j]; // } // return -1; // } int main() { int N,n,m,i,k,t; //scanf("%d",&N); char str[1000005]; k=1; while (~scanf("%d",&N),N) { scanf("%s",&str); build_next(str); printf("Test case #%d\n",k++); for (i=2;str[i-1];i++) { t= i-next[i]; if (i%t==0 && i/t>1) { printf("%d %d\n",i,i/t); } } // for (i=0;i<N;i++) // { // printf("%d",next[i]); // } putchar('\n'); } return 0; }
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
分析:此题目一开始真心没读懂,后来看别人的题解才知道题意。就是说从字符串的第二个开始,看前面是循环串吗,是的话就输出此时的位置,和循环串的周期,周期必须大于1
字符编号从0开始,那么if(i%(i-next[i])==0),则i前面的
串为一个轮回串,其中轮回子串出现i/(i-next[i])次。有点推导公式的感觉
对KMP算法又进一步了解了
3 aaa 12 aabaabaabaab 0
Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4
标签:kmp
原文地址:http://blog.csdn.net/xinwen1995/article/details/46129419