http://acm.hdu.edu.cn/showproblem.php?pid=1358
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4849 Accepted Submission(s): 2353
#include<stdio.h> #include<string.h> #define N 1000007 char S[N]; int Next[N]; void FindNext(int Slen) { int i=0, j=-1; Next[0] = -1; while(i<Slen) { if(j==-1 || S[i]==S[j]) Next[++i] = ++j; else j = Next[j]; } } int main() { int n, iCase=1; while(scanf("%d", &n), n) { int i; scanf("%s", S); FindNext(n); printf("Test case #%d\n", iCase++); for(i=2; i<=n; i++) { if(i%(i-Next[i])==0 && Next[i]) ///这里是个坑,当Next[i]==0的时候虽然满足前面的条件,但是它的前缀和后缀的最大匹配度是0 printf("%d %d\n", i, i/(i-Next[i])); } printf("\n"); } return 0; }
(KMP 根据循环节来计算)Period -- hdu -- 1358
原文:http://www.cnblogs.com/YY56/p/4834522.html