poj2406-Power Strings(kmp)

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;
}


發佈了61 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章