hdu1358 循环节

    题意:给定一个字符串,求该串长度为i的前缀的最大循环周期(前提是该前缀是循环串)。
#include<stdio.h>

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

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

int main()
{
    int i,Case;
    Case=0;
    while(scanf("%d",&n),n)
    {
        printf("Test case #%d\n",++Case);
        scanf("%s",s);
        getnext();
        for(i=2;i<=n;i++)
        {
            if(i%(i-next[i-1])==0&&i/(i-next[i-1])>1)
            {
                printf("%d %d\n",i,i/(i-next[i-1]));
            }
        }
        printf("\n");
    }
    return 0;
}

你可能感兴趣的:(hdu1358 循环节)