poj2406-Power Strings
用kmp來做的,把整個串看成一個匹配串,然後求它的next[i],如果strlen(str)-next[strlen(str)]的值被strlen(str)整除,那麼說明它找到了循環節,否則就。原理證明其實用四個字就可以說明:錯位相等。原理證明
這道活用了kmp的題目相當有意思!
#include
#include
#include
#define MAXN 1000008
int next[MAXN];
void getNext(char *p,int *next)
{
int j,k;
int lastIndex=strlen(p);
next[0]=-1;
j=0;
k=-1;
while(j < lastIndex)
{
if(k==-1||p[j]==p[k]) //匹配的情況下,p[j]==p[k]
{
++j;
++k;
next[j]=k;
}
else //p[j]!=p[k]
k=next[k];
}
}
char getstr[MAXN];
int main()
{
int listlen;int result;
int i,j,k;int len;
while(scanf("%s",getstr) && getstr[0]!='.'){
len=strlen(getstr);
getNext(getstr,next);
result=1;
if(len%(len-next[len])==0)
result=len/(len-next[len]);
printf("%d\n",result);
}
return 0;
}