[HDU 1358]Period[kmp求周期]

题意:

每一个power前缀的周期数(>1).

思路:

kmp的next. 每一个前缀都询问一遍.

 

#include <cstring>

#include <cstdio>

const int MAXN = 1000005;

int next[MAXN];

char s[MAXN];

//93MS	5092K

void prekmp()

{

    next[0] = -1;

    int j = -1;

    for(int i=1;s[i];i++)

    {

        while(j!=-1 && s[j+1]!=s[i])    j = next[j];

        if(s[j+1]==s[i])    j++;

        next[i] = j;

    }

}



int main()

{

    int n,cas = 0;

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

    {

        scanf("%s",s);

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

        prekmp();

        int len;

        for(int i=1;i<n;i++)

        {

            len = i-next[i];

            int k;

            if(!((i+1)%len))

            {

                if((k=(i+1)/len)>1)

                    printf("%d %d\n",i+1,k);

            }

        }

        printf("\n");

    }



}


 

 

你可能感兴趣的:(HDU)