poj1961(kmp算法next数组应用)
Posted frankchen831x
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1961(kmp算法next数组应用)相关的知识,希望对你有一定的参考价值。
题目链接:https://vjudge.net/problem/POJ-1961
题意:给定一个长为n的字符串(n<=1e6),对于下标i(2<=i<=n),如果子串s(1...i)是周期子串,输出其最大周期。
思路:
考察对kmp算法中next数组的定义掌握,如果(i+1)%(i-j)==0 && (i+1)/(i-j) > 1,那么该子串即为满足条件。
AC代码:
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=1e6+5; int n,cas,nex[maxn]; char s[maxn]; void get_next(){ int j; j=nex[0]=-1; for(int i=1;i<n;++i){ while(j>-1&&s[i]!=s[j+1]) j=nex[j]; if(s[i]==s[j+1]) ++j; nex[i]=j; if((i+1)%(i-j)==0&&(i+1)/(i-j)>1) printf("%d %d ",i+1,(i+1)/(i-j)); } } int main(){ while(scanf("%d",&n),n){ scanf("%s",s); printf("Test case #%d ",++cas); get_next(); printf(" "); } return 0; }
以上是关于poj1961(kmp算法next数组应用)的主要内容,如果未能解决你的问题,请参考以下文章
《算法竞赛进阶指南》0x15 POJ1961 KMPNext数组求循环节