HDU-4763 Theme Section KMP
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-4763 Theme Section KMP相关的知识,希望对你有一定的参考价值。
题意:求最长的子串E,使母串满足EAEBE的形式,A、B可以任意,并且不能重叠。
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4763
思路:这题对next数组可以说是考察的非常的细,也是通过这道题,也让我对next数组有了更深刻的了解。或者说之前只是云里雾里。(题外话就到这)。首先我们求出该字符串的Next数组,我们都知道对于Next[i]是从串首开始长度为i的子串的前缀与后缀相同的最大长度。那么我们标记字符串的中间位置,就是已该位置结束的字符串他的前缀与母串的后缀有相同部分,然后我们枚举以2-n-1为字符串末尾,来找第一个E。然后不断的找出最大值。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1e6+5; char s[maxn]; int Next[maxn]; int vis[maxn]; int len; void get_next() { int i=0; int j=-1; Next[0]=-1; while(i<len) { if(s[i]==s[j]||j==-1) Next[++i]=++j; else j=Next[j]; } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%s",s); len=strlen(s); get_next(); memset(vis,0,sizeof(vis)); int x=len; while(x>0) { if(len>=2*x) vis[x]=1; x=Next[x]; } int maxx=0; for(int i=len-1;i>1;i--) { x=i; while(x>0) { if(vis[x]&&i>=2*x&&len>=i+x) { maxx=max(maxx,x); break; } x=Next[x]; } } printf("%d\n",maxx); } return 0; }
以上是关于HDU-4763 Theme Section KMP的主要内容,如果未能解决你的问题,请参考以下文章