【KMP】POJ 1961 Period

链接

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

大意

给定字符串 S ,求出字符串 S 的所有循环节和其长度

思路

k m p

代码

#include<cstdio>
using namespace std;int t,n,nxt[1000001],j;
char s[1000001];;
signed main()
{
    while(scanf("%d",&n),n)
    {
        scanf("%s",s);j=0;
        for(register int i=1;i<=n;i++) nxt[i]=0;
        for(register int i=1;i<n;i++)
        {
            while(j&&s[i]!=s[j]) j=nxt[j];
            if(s[i]==s[j])nxt[i+1]=++j;//求nxt数组
        }
        printf("Test case #%d\n",++t);//输出
        for(register int i=2;i<=n;i++) if(i%(i-nxt[i])==0&&i/(i-nxt[i])>1) printf("%d %d\n",i,i/(i-nxt[i]));
        putchar(10);//因为循环节只有可能是i的约数。。。
    }
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/81774863
今日推荐