程序(已经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),所以程序会崩溃,因此只能做全局变量。