poj 1961 Period (最小重复子串 kmp)

来源:互联网 发布:创世写作 mac 编辑:程序博客网 时间:2024/05/24 07:11

最小覆盖子串长度为n-next[n] ,n为字符串长度。如果恰好覆盖就为n/(n-next[n]),否则为1.

所有前缀的最小重复子串,加一个循环即可。


附上代码喵:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;char name[1000010];int nex[1000010];void getnext(){memset(nex,0,sizeof(nex));nex[0]=-1;int j=-1,k=0;int len=strlen(name);while(k<len){if(j==-1||name[j]==name[k]){j++;k++;nex[k]=j;}elsej=nex[j];}}int main(){int n,ica=1;while(scanf("%d",&n),n){scanf("%s",name);printf("Test case #%d\n",ica++);getnext();for(int i=1;i<=n;i++){int len=i-nex[i];if(i%len==0&&i/len>1){printf("%d %d\n",i,i/len);}}printf("\n");}return 0;}


0 0