hdu 1358 KMP的next数据运用

由于next[i]保存的是前i-1个字符中最大的重复子序列,那么i-next[i]就是循环节。

#include<cstdio>

#include<cstring>

#include<iostream>

using namespace std;

int next[1000100];

void getnext(char *str)

{

    int j,k;

    memset(next,0,sizeof(next));

    j=0;

    k=-1;

    next[0]=-1;

    while(str[j])

    {

        if(k==-1 || str[j]==str[k])

            next[++j]=++k;

        else

            k=next[k];

    }

}

int main()

{

    int n,i,j;

    int Case=0;

    char str[1000010];

    while(scanf("%d",&n),n)

    {

        scanf("%s",&str);

        getnext(str);

        printf("Test case #%d\n",++Case);

        for(i=2;i<=n;i++)

        {

            int x=i/(i-next[i]);

            if(i%(i-next[i])==0&&x>1)

                printf("%d %d\n",i,x);

        }

        printf("\n");

    }

    return 0;

}

 

你可能感兴趣的:(ext)