《算法竞赛进阶指南》0x15 POJ1961 KMPNext数组求循环节
Posted randy-lo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《算法竞赛进阶指南》0x15 POJ1961 KMPNext数组求循环节相关的知识,希望对你有一定的参考价值。
题目链接:http://poj.org/problem?id=1961
通过next数组求字符串截止到i位置的最小循环节以及循环次数,可以在O(N)时间内得出,通过这个方法可以求得字符串的任意长度的循环节。
代码如下:
#include<iostream> #include<cstdio> using namespace std; #define maxn 1000010 char s[maxn]; int nxt[maxn]; int n; void pre(){ nxt[1]=0; for(int i=2,j=0;i<=n;i++){ while(j>0 && s[i]!=s[j+1])j=nxt[j]; if(s[i]==s[j+1])j++; nxt[i]=j; } } int main(){ int T=0; while(cin>>n && n){ scanf("%s",s+1); pre(); printf("Test case #%d ",++T); for(int i=2;i<=n;i++){ if(!(i%(i-nxt[i])) && nxt[i]){ printf("%d %d ",i,i/(i-nxt[i]));//到i位置为止的循环节 } } cout<<endl; } }
以上是关于《算法竞赛进阶指南》0x15 POJ1961 KMPNext数组求循环节的主要内容,如果未能解决你的问题,请参考以下文章
《算法竞赛进阶指南》0x43线段树 扫描线算法 POJ2482
《算法竞赛进阶指南》0x27A* 八数码问题 POJ1077
算法竞赛进阶指南扩展最大子段和POJ1050ToTheMax
《算法竞赛进阶指南》0x25广度优先搜索 POJ3322 Bloxorz I