现在的位置: 首页 > 综合 > 正文

poj2406 找最小循环节

2013年01月11日 ⁄ 综合 ⁄ 共 468字 ⁄ 字号 评论关闭

   这题同hdu3746一样,都是通过KMP找到字符串的最小循环节。这题wa了一次,刚开始以为一定有len%(len-next[len-1])==0,后来证实是错的。如:ababa,按照之前的做法输出2,很显然n=1。

#include<stdio.h>
#include<string.h>

#define N 1000005
char s[N];
int next[N],len;

void getnext()
{
    int i,j;
    next[0]=0;
    for(i=1,j=0;s[i];i++)
    {
        while(j>0&&s[i]!=s[j])
            j=next[j-1];
        if(s[i]==s[j])
            j++;
        next[i]=j;
    }
    len=i;
}

int main()
{
    while(~scanf("%s",s))
    {
        if(strcmp(s,".")==0)
            break;
        getnext();
        if(len%(len-next[len-1])==0)
            printf("%d\n",len/(len-next[len-1]));
        else
            printf("1\n");
    }
    return 0;
}

 

抱歉!评论已关闭.