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

来源:互联网 发布:知乎如何回答问题 编辑:程序博客网 时间:2024/05/02 19:59

题意

求所有循环次数大于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");    }} 
0 0