#include <stdio.h>
#include <string.h>
int next[1000001]; //注意数组要开的足够大但也不能超内存
char ch[1000001];
int getnext() //获得next数组
{
int k=-1,j=0;
next[0]=-1;
int l=strlen(ch);
while(j<l)
{
if(k==-1||ch[k]==ch[j])
{
k++;
j++;
if(ch[k]!=ch[j])
next[j]=k;
else
next[j]=next[k];
}
else
k=next[k];
}
return 0;
}
int main()
{
int l,k;
while(~scanf("%s",ch))
{
if(ch[0]=='.')
break;
else
{
l=strlen(ch);
getnext();
if(l%(l-next[l])==0) //还是不能理解此行代码
k=l/(l-next[l]);
else
k=1;
printf("%d\n",k);
}
}
}
用kmp查找字符串的循环节
最新推荐文章于 2020-04-10 17:02:00 发布