题目描述

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

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

baacaabbacabb

输出样例#1:

12

说明

【样例说明】

从第二个字符开始的字符串aacaabbacabb可分为aacaabbacabb两部分,且两者都是回文串。

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

Solution:

  本题$zyys$啊!~

  很容易想到$manacher$,于是先打个板子看看,处理出以$i$为中心的最长回文半径$p[i]$后,就断思路了。

  我首先想到的是,在每次更新$p[i]$后,分别处理出以$i$为中心的半径$p[i]$内,每个位置为开头和结尾的最长回文子串长度($manacher$结束后直接枚举断点就可以得到答案),但是这样强行又将复杂度拉到了$O(n^2)$。于是,开始断线~

  后面看看巨佬们的思路,豁然**,我是真的蠢啊~

  其实,将我开始的思路修改一下即可:

  我们维护最长回文半径$p[i]$的同时,再分别维护两个东西,以$i$为结尾的最长回文子串的长度$ll[i]$,和以$i$为开头的最长回文子串的长度$rr[i]$。

  那么很显然,因为以$i$为中心的最长回文子串长度为$p[i]-1$,所以每次更新$p[i]$后,我们只需处理出当前这个回文子串的左右边界(中间的每个点的$ll[i],rr[i]$可以在$manacher$结束后$O(n)$处理出),则$ll[i+p[i]-1]=max(ll[i+p[i]-1],p[i]-1)$(更新以$i+p[i]-1$为结尾的最长回文长度),同理$rr[i-p[i]+1]=max(rr[i-p[i]+1],p[i]-1)$。

  跑完$manacher$后,我们$O(n)$递推出每个$#$为断点的$ll[i]$和$rr[i]$,其中$rr[i]$因为是$i$结尾的回文长度,所以直接顺推,每往后移一位,最长回文子串长度$-2$,于是$rr[i]=max(rr[i],rr[i-2]-2)$($i-2$是上一个$#$位置),同理$ll[i]$直接逆推,类似地$ll[i]=max(ll[i],ll[i+2]-2)$。

  最后枚举每个$#$为断点,更新$ans$就$OK$了。

代码:

#include<bits/stdc++.h>
#define For(i,a,b,c) for(int (i)=(a);(i)<=(b);(i)+=(c))
#define Bor(i,a,b,c) for(int (i)=(b);(i)>=(a);(i)-=(c))
#define Min(a,b) ((a)>(b)?(b):(a))
#define Max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int N=200050;
int p[N],ll[N],ans,rr[N],mx,id,cnt;
char s[N],t[N];
int main(){scanf("%s",t);int len=strlen(t);s[++cnt]='$',s[++cnt]='#';For(i,0,len-1,1)s[++cnt]=t[i],s[++cnt]='#';s[++cnt]='\0';For(i,1,cnt,1){if(i<mx)p[i]=Min(p[id*2-i],mx-i);else p[i]=1;while(s[i-p[i]]==s[i+p[i]])p[i]++;if(mx<i+p[i])id=i,mx=i+p[i];ll[i+p[i]-1]=Max(ll[i+p[i]-1],p[i]-1);rr[i-p[i]+1]=Max(rr[i-p[i]+1],p[i]-1);}For(i,2,cnt,2)rr[i]=Max(rr[i],rr[i-2]-2);Bor(i,2,cnt,2)ll[i]=Max(ll[i],ll[i+2]-2);For(i,2,cnt,2)if(rr[i]&&ll[i])ans=Max(ans,ll[i]+rr[i]);cout<<ans;return 0;
}

转载于:https://www.cnblogs.com/five20/p/9090876.html

P4555 最长双回文串相关推荐

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

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

  2. [国家集训队]最长双回文串 manacher

    ---题面--- 题解: 首先有一个直观的想法,如果我们可以求出对于位置i的最长后缀回文串和最长前缀回文串,那么我们枚举分界点然后合并前缀和后缀不就可以得到答案了么? 所以我们的目标就是求出这两个数列 ...

  3. BZOJ 2565: 最长双回文串

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

  4. 青橙 A1280. 最长双回文串

    A1280. 最长双回文串 时间限制:2.0s   内存限制:512.0MB   总提交次数:   AC次数:   平均分: 将本题分享到: 查看未格式化的试题   提交   试题讨论 试题来源 中国 ...

  5. 【BZOJ2565】最长双回文串(回文树)

    [BZOJ2565]最长双回文串(回文树) 题面 BZOJ 题解 枚举断点\(i\) 显然的,我们要求的就是以\(i\)结尾的最长回文后缀的长度 再加上以\(i+1\)开头的最长回文前缀的长度 至于最 ...

  6. HYSBZ 2565 最长双回文串 (回文树)

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

  7. P4555-[国家集训队]最长双回文串【Manacher】

    正题 题目链接:https://www.luogu.com.cn/problem/P4555 题目大意 长度为nnn的串,双回文串的定义是两个连续的回文串,求最长的双回文串. 解题思路 我们用马拉车维 ...

  8. 2682. 【WC2012选拔12.17】最长双回文串

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

  9. HYSBZ - 2565 最长双回文串(回文自动机)

    题目链接:点击查看 题目大意:给出一个字符串 s ,求最长双回文子串,题目规定最长双回文子串 t 可以拆成左右两部分,满足两部分都是回文串 题目分析:一开始读错题了,以为是双回文串本身也需要是回文串, ...

最新文章

  1. 一些挺不错的visualstudio主题样式
  2. 7.LARS lasso 模型
  3. DotnetSpider (一) 架构的理解、应用、搭建
  4. [转载]从零开始学习jQuery (一) 开天辟地入门篇
  5. Unity项目代码书写规范
  6. 鸿蒙os更新要求,华为鸿蒙OS即将迎来升级 手机版本或仍需时间
  7. 数据库设计三大范式应用实例剖析
  8. [转载]Linux批量替换不同文件中的相同字符串
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的二手房交易系统
  10. 六石管理学:使用排除法解决问题
  11. NOIP2016普及组复赛全国一等奖名单及排名(续表_919~1419名)
  12. BM77SPP03蓝牙模块开发
  13. 网上流传房地产崩盘时间表 楼市重蹈日本覆辙 - 新闻中心 - 搜狐焦点网
  14. Python爬虫进阶教程(五):数据存储
  15. java ctor_vue-test-utils设置获取TypeError:无法在字符串上创建属性'_Ctor'
  16. 互联网晚报 | 05月17日 星期二 | 郑州首套房贷利率最低降至4.4%;可口可乐被曝员工不得购买竞品...
  17. 微服务架构之服务网关
  18. Load balancer does not have available server for client问题
  19. 通过URL在前端页面传参的方法
  20. CentOS安装JDK1.8

热门文章

  1. [改善Java代码]非稳定排序推荐使用List
  2. 工作日志WebRoot--编辑页关于处理两个关联的选择框
  3. Gson读写JSON 数据
  4. Entity Framework在WCF中序列化的问题(转)
  5. 为Java应用程序加上退出事件处理(ShutdownHook)
  6. vue学习:7、路由跳转
  7. Macosx 安装 ionic 成功教程
  8. 北邮-上机-提交错误解决及一些经验
  9. 园区网VLAN应用实例
  10. 《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(13)--- 线程安全接口和双检查加锁优化...