[KMP求最小循环节][HDU1358][Period]

题意

求所有循环次数大于1的前缀
的最大循环次数和前缀位置

解法

直接用KMP求最小循环节

当满足i%(i-next[i])&&next[i]!=0
前缀循环次数大于1
最小循环节是i-next[i]

#include <cstdio>
#include <cstring> 
#include <iostream>
#include <cstdlib>
using namespace std;
char S[2000000];
int NEXT[2000000];
int len;
int CASE=0;
void get_next()
{
    for(int i=1;i<=len;i++)
    {
        int p=i-1;
        while(S[i]!=S[NEXT[p]+1]&&p!=0) p=NEXT[p];
        if(p!=0)
        NEXT[i]=NEXT[p]+1;
    }
}
int main()
{
    int N;
//  freopen("a.in","r",stdin);
    while(cin>>N&&N)
    {
        memset(S,0,sizeof(S));
        memset(NEXT,0,sizeof(NEXT));
        printf("Test case #%d\n",++CASE);
        scanf("%s",S+1);        
        len=strlen(S+1);
        get_next();
        for(int i=1;i<=len;i++)
        {
            if(i%(i-NEXT[i])==0&&NEXT[i]!=0)
                {
                    printf("%d %d\n",i,i/(i-NEXT[i]));
                }
        }
        printf("\n");
    }
} 

posted on 2015-09-21 00:01  DDUPzy  阅读(170)  评论(0编辑  收藏  举报

导航