2682. 【WC2012选拔12.17】最长双回文串 (Standard IO)

Time Limits: 2000 ms  Memory Limits: 524288 KB     

Description

顺序和逆序读起来完全一样的串叫做回文串。比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同)。

  输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串。

Input

一行由小写英文字母组成的字符串S。

Output

一行一个整数,表示最长双回文子串的长度。

Sample Input

baacaabbacabb

Sample Output

12

Data Constraint

Hint

【样例说明】

从第二个字符开始的字符串aacaabbacabb可分为aacaa与bbacabb两部分,且两者都是回文串。
【数据范围】
对于10%的数据,2≤|S|≤103。

  对于30%的数据,2≤|S|≤104。

  对于100%的数据,2≤|S|≤105。

思路:

先做一遍MANACHER,然后枚举分界点(为#)

那么以这个点为分界的最长双回文串会由最左边的能覆盖到这个点的串和最右边的能覆盖到这个点的串组成

那么扫两遍求出每个点最左和最右能覆盖到它的回文串中心。(就是反过来求以每个点为中心的回文串能覆盖哪些点

然后枚举即可

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>using namespace std;char s[200011];
int r[200011],lm[200011],rm[200011];
int i,n,x,z,q,len,j;
char c;void Read()
{while(c=getchar(),c<'a'||c>'z');s[++n]='#';s[++n]=c;while(c=getchar(),c>='a'&&c<='z'){s[++n]='#';s[++n]=c;}s[++n]='#';
}void Manacher()
{int i,len,l,k;len=0;for(i=1;i<=n;i++){if(len<i){l=0;while(s[i-l]==s[i+l]&&i-l>=1&&i+l<=n)l++;r[i]=l;}else{l=min(len-i+1,r[k+k-i]);while(s[i+l]==s[i-l]&&i-l>=1&&i+l<=n)l++;r[i]=l;}if(i+r[i]-1>len){len=i+r[i]-1;k=i;}}
}int main()
{Read();Manacher();r[0]=0;len=0;for(i=1;i<=n;i++){if(i+r[i]-1>len){for(j=len+1;j<=i+r[i]-1;j++)lm[j]=i;len=i+r[i]-1;}if(len==n)break;}len=n+1;for(i=n;i>=1;i--){if(i-r[i]+1<len){for(j=i-r[i]+1;j<=len-1;j++)rm[j]=i;len=i-r[i]+1;}if(len==1)break;}for(i=1;i<=n;i++)if(s[i]=='#'){z=(rm[i]-i+1)*2-1+(i-lm[i]+1)*2-1-1;if(z/2>q)q=z/2;}printf("%d\n",q);
}

转载于:https://www.cnblogs.com/applejxt/p/3813454.html

bzoj 2565 manacher相关推荐

  1. bzoj 2565: 最长双回文串 manacher算法

    2565: 最长双回文串 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem. ...

  2. BZOJ 2565 最长双回文串 Manacher

    题目大意: 定义双回文串G是指一个可以被拆分成两个部分(S和T)的字符串G = S + T, 且S和T都是回文串的串, G自己本身可以不是回文串 给出一个长度为n ( 2 <= n <= ...

  3. BZOJ 2565: 最长双回文串

    2565: 最长双回文串 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1769  Solved: 895 [Submit][Status][Dis ...

  4. HYSBZ 2565 Manacher算法

    题意 中文题,不解释 题解 这道题正解应该是回文树,不过用Manacher算法8s水过了.首先用Manacher算法算出来P数组,然后将所有的P数组-1,这样的话便能得到以某一个位置为中心的回文串最长 ...

  5. BZOJ 2565 最长双回文串

    回文树 正着反着做一遍回文树即可.然而好久没写回文树了,调了好一会儿.大概把一些细节讲一下. 需要建两个根root1(len = -1)和root2(len = 0),其中root1的pre是自己,r ...

  6. BZOJ 2565 最长回文串

    传送门 回文自动机! 正着跑一遍 记录以每个点作为回文子串的右端点的最大长度 倒过来跑一遍 记录每个点作为左端点的最大长度 求个和就好啦 附代码. #include<cstdio> #in ...

  7. BZOJ刷题记录---提高组难度

    BZOJ刷题记录---提高组难度 总目录详见https://blog.csdn.net/mrcrack/article/details/90228694 序号 题号 算法 思想难度 实现难度 总难度 ...

  8. 回文树笔记(转自quack_quack)

    1.回文树的next[charset]指针: b->aba 那么就这样表示:b.next[a]=aba 当然树里面肯定不能存字符串,于是就直接用下标标号代替了 2.回文树的fail指针: 跟ac ...

  9. 「BZOJ 2342」「SHOI 2011」双倍回文「Manacher」

    题意 记\(s_R\)为\(s\)翻转后的串,求一个串最长的形如\(ss_Rss_R\)的子串长度 题解 这有一个复杂度明显\(O(n)\)的做法,思路来自网上某篇博客 一个双倍回文串肯定当且仅当本身 ...

最新文章

  1. PHP exec xargs 不执行,关于 ‘--exec’ 参数( find 命令)及介绍 ‘xargs ’命令区别(新版)...
  2. 【Lv1-Lesson002】He and She
  3. Python函数内置函数
  4. 菜鸟学Linux命令:端口查看和操作命令
  5. SSM Automation 更新AMI镜像
  6. OSG官方自带的例子程序简介
  7. Apache Camel的性能调整思路
  8. js将canvas保存成图片并下载
  9. 模型压缩 相关文章解读
  10. C语言之局部变量全局变量变量存储方式
  11. Django中form字段操作
  12. Mysql(2)_ binlog文件
  13. 17.词法分析和语法分析
  14. 找零钱问题系列之暴力搜索
  15. 一个分组查询的SQL 常用算法(附源码可直接执行)
  16. 【高数复盘】1.1映射与函数思维导图
  17. 教程向 | 安装 地表最强IDE---Microsoft Visual Studio 2022
  18. 计算机软件工程学校排名,软件工程专业全国高校排名前十
  19. windbg 查看结构体_Windbg入门实战讲解
  20. 解决Linux上rar压缩包文件无法解压缩的问题

热门文章

  1. 普通本科,开发一周年纪念日—-赠给自己的礼物
  2. SR(Segment Routing)不是MPLS的优化和升级
  3. 人脸扫描建模_人脸识别中的特征建模方法与流程
  4. java.sql.SQLException: Parameter number X is not an OUT parameter
  5. 远程计算机已加入AAD凭据不工作
  6. lab值意义_lab是什么意思?
  7. 块存储、文件存储、对象存储这三者的区别
  8. 【解决】阿拉伯语等右向左排版文字CSS解决方案
  9. 生成MT/MTd模式的tet.lib
  10. 计算机专业课题 结题报告,《有效技能研究与实践》课题结题报告