Jzoj2682 最长双回文串
2017-12-07 22:01
239 查看
顺序和逆序读起来完全一样的串叫做回文串。比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同)。
输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串。
PAM模(mu)板题<非常好写<弄出PAM让后记录每个结尾的最长回文串让后反过来在建一次加起来取max就好了
当然也可以manacher+DP,跑的快
输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串。
PAM模(mu)板题<非常好写<弄出PAM让后记录每个结尾的最长回文串让后反过来在建一次加起来取max就好了
当然也可以manacher+DP,跑的快
#include<stdio.h> #include<string.h> #include<algorithm> #define N 300010 using namespace std; char S ; int n,m=0,cnt=1,lst=0,g ,ans=0; int s [26],mx ={0,-1},sz ,f ={1}; inline int extend(int c){ int p=lst,np; for(++m;S[m-mx[p]-1]!=S[m];p=f[p]); if(!s[lst=p][c]){ np=++cnt; mx[np]=mx[p]+2; for(p=f[p];S[m-mx[p]-1]!=S[m];p=f[p]); f[np]=s[p][c]; lst=s[lst][c]=np; } else lst=s[p][c]; ++sz[lst]; } int main(){ scanf("%s",S+1); n=strlen(S+1); for(int i=1;i<=n;++i) extend(S[i]-'a'),g[i]=mx[lst]; memset(s,0,sizeof s); cnt=1; lst=0; m=0; reverse(S+1,S+1+n); for(int i=1;i<=n;++i) extend(S[i]-'a'),ans=max(ans,mx[lst]+g[n-i]); printf("%d\n",ans); }
相关文章推荐
- JZOJ 2682 【WC2012选拔12.17】最长双回文串
- 2682. 【WC2012选拔12.17】最长双回文串
- 腾讯2016实习生笔试题 获得最长回文串长度
- 求最长回文串的几种方法
- 算法笔记_032:最长回文串(Java)
- BZOJ 2565 最长双回文串 Manacher
- Manacher’s Algorithm( O(n)最长回文串)
- 算法竞赛经典入门 例3-4最长回文串
- [BZOJ2565]最长双回文串(manacher+讲解)
- 最长回文串
- 2016.8.6 manacher算法(最长回文串)
- 627 - 最长回文串
- 【后缀数组】 求字符串的最长回文串
- psd面试—最长回文串模板
- [LeetCode] 409. 最长回文串
- 【dp/后缀树】最长回文串、最长重复回文串、最长非重复回文串。。
- 5.最长连续回文串
- 从0打卡leetcode之day 6--最长回文串
- POJ----(3974 )Palindrome [最长回文串]
- 最长回文串