P4555 最长双回文串

题目描述

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

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

输入输出格式

输入格式:

一行由小写英文字母组成的字符串 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题(34)—— 线程

1&#xff0e;线程的概念&#xff1a; 2 与进程的区别: 3 线程与进程的区别和联系? 线程是否具有相同的堆栈? 1、线程是指进程内的一个执行单元,也是进程内的可调度实体. 2、与进程的区别: (1)调度&#xff1a;线程作为调度和分配的基本单位&#xff0c;进程作为拥有资源…

如何利用MySQL加密函数保护Web网站敏感数据

如果您正在运行使用MySQL的Web应用程序&#xff0c;那么它把密码或者其他敏感信息保存在应用程序里的机会就很大。保护这些数据免受***或者窥探者的获取是一个令人关注的重要问题&#xff0c;因为您既不能让未经授权的人员使用或者破坏应用程序&#xff0c;同时还要保证您的竞争…

躺平,躺下就能赢吗?

之前在群里讨论这个话题&#xff0c;说躺平挺好的&#xff0c;没那么大压力&#xff0c;我也觉得躺平是好事&#xff0c;每个人都要追求理想的权力&#xff0c;那么反过来&#xff0c;每个人也有不追求理想的权力。躺平如果说的好听一些&#xff0c;也可以认为是躺赢&#xff0…

第一站---大连---看海之旅

5月下旬至7月上旬 是大连最舒服的季节 还不是很热 微风拂面 神清气爽的感觉 工具/原料 坐公交的零钱防晒霜可以下水的鞋推荐一下旅游路线吧个人意见:来大连必去的几个景点分为两类:免费的: 1.星海湾景区。在星海湾景区你可以来到星海广场、星海湾浴场、星海公园&#xff0c;这…

感觉stm32太简单是一种自负吗?

其实简单或者复杂都不重要&#xff0c;重要的是通过STM32我们能学习到什么&#xff1f;做一个键盘/鼠标&#xff0c;可以学习USB协议。做一个联网设备&#xff0c;需要学习以太网&#xff0c;TCP/IP协议的底层实现。做一个无线设备&#xff0c;可能需要学习蓝牙、WIFI或者zigbe…

回车 触发 提交事件

//gridview 文本框 回车 触发 Button 事件 < script type "text/javascript" language "javascript" > function clickButton() { if ( event.keyCode 13 ) { document.all ( ibtnUpdate ).click(); return false; } } < / script > < a…

每日一题(35)—— heap与stack的差别

heap与stack的差别: Heap是堆&#xff0c;stack是栈。 Stack的空间由操作系统自动分配/释放&#xff0c;Heap上的空间手动分配/释放。 Stack空间有限&#xff0c;Heap是很大的自由存储区 C中的malloc函数分配的内存空间即在堆上,C中对应的是new操作符。 程序在编译期对变量…

Scrapy学习-25-Scrapyd部署spider

Scrapyd部署爬虫项目 github项目https://github.com/scrapy/scrapyd 官方文档http://scrapyd.readthedocs.org/ 安装scrapydhttp://scrapyd.readthedocs.io/en/stable/install.html 运行# 在虚拟环境中使用scrapd命令# scrapyd是一个服务器监听在本地的6800端口scrapyd 安装scr…

耗时两年,19岁小伙采用230片纯74逻辑芯片搭建出32位处理器!可玩贪吃蛇

从设计 CPU、制作原型机、最终成品到软件编程&#xff0c;19 岁极客小伙用了整整两年的时间。RISC-V 是一个基于精简指令集&#xff08;RISC&#xff09;原则的开源指令集架构&#xff08;ISA&#xff09;&#xff0c;它是对应开源软件运动的一种「开源硬件」。该项目于 2010 年…

VC++ 6.0 与VS2008 C++ DEBUG工具(Windows)介绍

在VC 6.0 里面&#xff0c;debug工具有这些&#xff1a; 请看大图展示&#xff1a; 这里面几个工具都是经常用到的。比如&#xff1a;上下文信息&#xff0c;可以查看当前变量的值和地址Memory&#xff1a; 可以输入地址查看里面的内容。对调试和检查指针特别有用。 在vs2008里…

每日一题(36)—— 什么是预编译 , 何时需要预编译?

什么是预编译 , 何时需要预编译&#xff1f; &#xff11;、总是使用不经常改动的大型代码体。 &#xff12;、程序由多个模块组成&#xff0c;所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下&#xff0c;可以将所有包含文件预编译为一个预编译头。

数组与指针不能混用的情况

扫描二维码获取更多精彩嵌入式杂牌军编辑|追梦星空公众号|嵌入式杂牌军✎ 编 者 悟 语正当性的出发点应该是少目的性、不带偏见、以尊重为前提的多方考虑。文 章 导 读C中的数组有能混用的情况&#xff0c;有不能混用的情况&#xff0c;今天就带小伙伴们探究一下&#xff01;阅…

解决/WEB-INF目录下的jsp页面引入webRoot下的Js、css和图片的问题

通常把jsp页面放在webRoot的/WEB-INF下可以防止访问者直接输入页面。 而webRoot的/WEB-INF下的页面是受保护的&#xff0c;用户无法通过形如http://localhost:8080/test/webRoot/WEB-INF/content/xx.jsp来访问&#xff0c;他们的访问都必须透过struts处理请求才能达到。 然而&a…

[CTO札记]盛大游戏上市,是对《文化产业振兴规划》的响应

重要国策《文化产业振兴规划》于9月26日正式对外公布。巧合的是&#xff0c;就在前一天&#xff08;9月25日 &#xff09;&#xff0c;盛大游戏&#xff08;SDG&#xff09;成功在NASDAQ上市&#xff0c;并且创下了美股IPO规模之最&#xff08;10亿美元&#xff09;。1&#xf…

Linux内核入门之路 (非广告)

笔者从开始接触 Linux 内核应该有 4 ~ 5 年了&#xff0c;虽然不敢说非常了解 Linux 内核&#xff0c;但起码也有了点眉目。所以&#xff0c;本文主要想分享一下我的 Linux 内核入门之路&#xff0c;如果对大家有帮助的话&#xff0c;希望能够转发一下&#xff0c;帮助更多想学…

BZOJ3251: 树上三角形

BZOJ3251: 树上三角形 Description 给定一大小为n的有点权树&#xff0c;每次询问一对点(u,v)&#xff0c;问是否能在u到v的简单路径上取三个点权&#xff0c;以这三个权值为边长构成一个三角形。同时还支持单点修改。Input 第一行两个整数n、q表示树的点数和操作数第二行n个整…

CSS 背景透明

一、首先说下CSS实现背景全透明 全透明比较好实现。在要实现透明功能的id或Class里&#xff0c;输入 {background:transparent;}在IE、Firefox等浏览器下都有效果。二、再来说下CSS实现背景半透明 可以实现自定义的透明程度&#xff0c;代码如下&#xff1a; { filter:alpha(op…

万能红外遥控开发

下班刚回到家&#xff0c;天气很热~空调遥控器呢&#xff1f;找不到&#xff01;躺平不想动~风扇遥控器呢&#xff1f;找不到&#xff01;想看电视&#xff0c;不想动~电视遥控器呢&#xff1f;找不到&#xff01;好不容易找到了&#xff0c;遥控器没电&#xff1f;崩溃&#x…

每日一题(38)—— 一个32位的机器,该机器的指针是多少位?

一个32位的机器,该机器的指针是多少位&#xff1f; 指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总线。所以指针的位数就是4个字节了。

简单的用户登录(一)

用来实现一个用户登录&#xff0c;这里要实现的是&#xff0c;输入用户名和密码&#xff0c;提交后&#xff0c;验证两者是否正确。 这里直接对表单提交的二者进行字符串判断&#xff0c;不涉及商业层活动。 实现项&#xff1a; 1 表单提交 2 获取表单提交值 3 客户端判断不为空…