POJ 2406 Power Strings(KMP)

http://poj.org/problem?id=2406

求最小重复字串

KMP next函数

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define nMAX 1000005
using namespace std;
int next[nMAX],len;
char s[nMAX];
void get_next()
{  //next[i]表示i前面匹配了几个字符
    int i,j;
    i=0,j=-1;
    next[0]=-1;//初始化
    while(i<=len)
    {
        if(j==-1||s[i]==s[j])
        {
             i++,j++;
             next[i]=j;
        }
        else
            j=next[j];
    }
}
int main()
{
    while(~scanf("%s",s))
    {
        len=strlen(s);
        if(s[0]=='.')break;
        get_next();
        int ans=len-next[len];
        if(len%ans==0) printf("%d\n",len/ans);
        else printf("1\n");
    }
    return 0;
}

  

posted @ 2012-08-10 11:36  快乐.  阅读(126)  评论(0编辑  收藏  举报