poj 1961 Period (最小重复子串 kmp)
2015-03-20 21:23
113 查看
最小覆盖子串长度为n-next
,n为字符串长度。如果恰好覆盖就为n/(n-next
),否则为1.
所有前缀的最小重复子串,加一个循环即可。
附上代码喵:
,n为字符串长度。如果恰好覆盖就为n/(n-next
),否则为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; } else j=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; }
相关文章推荐
- POJ 1961 Period(KMP求一个串的重复子串)
- Period POJ - 1961(kmp求最大周期,最小循环节)
- POJ 1961(KMP前缀最长重复子串)
- POJ 1961 Period KMP 最小循环节
- KMP 求最小循环节 POJ - 1961 Period
- poj 1961 Period (KMP+最小循环节)
- POJ 1961 Period(KMP最小循环节)
- poj1961--Period(KMP求最小循环节)
- POJ 1961 Period——kmp求最小循环节
- POJ 1961 Period【KMP最小循环节】
- POJ-1961 Period-KMP前缀串重复次数
- LA 3026 && POJ 1961 Period (利用kmp中的next数组找最小的循环节 )
- poj 2406 KMP 重复子串
- poj 3693 Maximum repetition substring 重复次数最多的子串(若有多个 输出字典序最小的子串) 后缀数组 (DC3) (SA)
- poj 1961 Period(KMP训练指南例题)
- poj 1961:Period (KMP)
- POJ 1961Period / POJ 2406 Power Strings / POJ 3461 Oulipo /SDUT 2747 循环节 初涉KMP
- poj_2406Power Strings && poj_1961Period && poj_2752Seek the Name, Seek the Fame(KMP)
- poj_2406Power Strings && poj_1961Period && poj_2752Seek the Name, Seek the Fame(KMP)
- POJ 1961 Period(KMP 求循环)