POJ 1961 Period KMP next数组的应用

 Period

题意:

给你一个字符串,求这个字符串到第i个字符为止的循环节的次数。

比如aabaabaabaab,长度为12.到第二个a时,a出现2次,输出2.到第二个b时,aab出现了2次,输出2.到第三个b时,aab出现3次,输出3.到第四个b时,aab出现4次,输出4.


例子:

字符串为aabaabaabaab
前2位也就是aa是a反复2次
前6位也就是aabaab是aab反复2次
前9位也就是aabaabaab是aab反复3次
前12位也就是aabaabaabaab是aab反复4次

解题思路:经由过程KMP的get_next.获得next[]的值。从2开端遍历每个next[i]值,然后用 i-next[j]即获得了反复字串的长度。。。。则i/(i-next[j])即为最大的个数。但同时必须是能整除的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
char s[1000010];
int next[1000010];
int len;
int get_next()
{
    next[0]=-1;
    int i=0,j=-1;
    while(i<len)
    {
        if(j==-1||s[i]==s[j])
        {
            i++;j++;
         //   if(s[i]==s[j])
                //next[i]=next[j];
           // else
                next[i]=j;
        }
        else
            j=next[j];
    }
}
int main ()
{
    int n,Case=0;
    while(~scanf("%d",&n),n)
    {
        if(Case!=0)
            printf("\n");
        scanf("%s",s);
        len=strlen(s);
        get_next();
        printf("Test case #%d\n",++Case);
        for(int i=1;i<=len;i++)
        {
          //  printf("%d %d\n",i,next[i]);
          int t=i/(i-next[i]);
            if(i%(i-next[i])==0&&t>1)
                printf("%d %d\n",i,t);
        }
    }
    return 0;
}


你可能感兴趣的:(POJ 1961 Period KMP next数组的应用)