首先弄明白next[]数组的意义,next[i]表示 第i个数的前 L 个字符串等于 后 L 个数的字符串,且字符串长度最长,即L最大;
例如:字符串 abcabcda
next[0]=-1;
next[1]=0; a
next[2]=0; ab
next[3]=0; abc
next[4]=1; abca,
next[5]=2; abcab,
next[6]=3; abcabc,
next[7]=0; abcabcd,
next[8]=1; abcabcda,
求法:
void getnext()
{
int i=0,k=-1;
next[0]=-1;
while(i<n){
if(k==-1 || p[k]==p[i]){
k++;
i++;
next[i]=k;
}
else
k=next[k];
}
}
if(n%(n-next[n])==0)时,n/(n-next[n])就是 答案,自己画图感受一下吧,骚年!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char p[1000050];
int next[1000050];
int n;
void getnext()
{
int i=0,k=-1;
next[0]=-1;
while(i<n){
if(k==-1 || p[k]==p[i]){
k++;
i++;
next[i]=k;
}
else
k=next[k];
}
}
int main()
{
while(scanf("%s",p)){
if(strcmp(p,".")==0)
break;
n=strlen(p);
getnext();
if(n%(n-next[n])==0)
printf("%d\n",n/(n-next[n]));
else
printf("1\n");
}
}