程序(已经accepted):
#include<stdio.h> #include<string.h> #include<memory.h> #define N 1000010 char str[N]; int next[N]; int get_next(char pattern[], int next[]) { int j=0,k=-1; int len=strlen(pattern); next[0]=-1; while(j<len) { if(k==-1||pattern[j]==pattern[k]) next[++j]=++k; else k=next[k]; } j=len-k;//如果最后一个位置不匹配,那么就会滚到len-k的位置,也就是最小重复字串的长度。 if(len%j==0) return len/j; else return 1; } int main() { while(scanf("%s", str), str[0]!='.') { printf("%d\n", get_next(str, next)); } return 0; }</span><strong style="font-size:18px; color: rgb(0, 0, 153);"> </strong>
本题还是很有价值的:
1. 考察了KMP算法的灵活应用;
2. 由于1000010*4(int型)会超过栈空间(1M),所以程序会崩溃,因此只能做全局变量。
原文地址:http://blog.csdn.net/xumesang/article/details/45040261