【BZOJ2565】最长双回文串 Manacher
【BZOJ2565】最长双回文串
Description
输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串。
Input
一行由小写英文字母组成的字符串S。
Output
Sample Input
Sample Output
HINT
样例说明
从第二个字符开始的字符串aacaabbacabb可分为aacaa与bbacabb两部分,且两者都是回文串。
对于100%的数据,2≤|S|≤10^5
题解:网上好多题解都是回文树,回文自动机,感觉没有必要啊!直接上Manacher算法
由于双回文串是将两个回文串拼在一起得到,我们可以枚举中间的'*'点,预处理出以它结尾的最长回文串和以它开头的最长回文串,然后加在一起更新答案。由于求以它结尾的回文串和以它开头的回文串是互部影响的,我这里只说怎么求以它结尾的最长回文串,这里用ls[j]表示。
当我们用Manacher算法求出回文中心i的回文半径rl[i]后,那么在(i,i+rl[i])内的字符都可以用 以i为中心的回文串 来结尾,(就是说以i为中心的回文串能以(i,i+rl[i])内的字符结尾,以(i,i+rl[i])内字符结尾的最长回文串可能以i为中心)
但是我们不能用i一个一个更新以(i,i+rl[i])内的字符结尾的最长回文串长度啊,但是我们发现,以i+rl[i]结尾的回文串长度为rl[i]-1(不算中间的'*'),以i+rl[i]-2结尾的回文串长度自然就是rl[i]-1-2(再说一遍,不算中间的'*')。然后我们只需要从左到右扫一遍,令ls[i]=max(ls[i],ls[i-2]-2)就行啦!
感觉说了这么多也没有直接看代码简单明了
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
char s1[500010],str[1000010];
int n,len,rl[1000010],mx,pos,ls[1000010],rs[1000010],ans;
int main()
{
scanf("%s",s1);
int i;
len=strlen(s1);
for(i=0;i<len;i++) str[n++]='*',str[n++]=s1[i];
str[n++]='*';
for(mx=-1,i=0;i<n;i++)
{
if(mx>i) rl[i]=min(mx-i+1,rl[2*pos-i]);
else rl[i]=1;
for(;i+rl[i]<n&&rl[i]<=i&&str[i+rl[i]]==str[i-rl[i]];rl[i]++);
if(i+rl[i]-1>mx) mx=i+rl[i]-1,pos=i;
rs[i-rl[i]+1]=max(rs[i-rl[i]+1],rl[i]-1);
ls[i+rl[i]-1]=max(ls[i+rl[i]-1],rl[i]-1);
}
for(i=0;i<n;i+=2) rs[i]=max(rs[i],rs[i-2]-2);
for(i=n-1;i>=0;i-=2) ls[i]=max(ls[i],ls[i+2]-2);
for(i=0;i<n;i+=2) if(ls[i]&&rs[i]) ans=max(ans,ls[i]+rs[i]);
printf("%d",ans);
return 0;
}
【BZOJ2565】最长双回文串 Manacher的更多相关文章
- BZOJ2565:最长双回文串(Manacher)
Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同). 输入长度为n的串S,求S的最长双回文子串T ...
- BZOJ2565最长双回文串——manacher
题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T,即可将T分为两 ...
- BZOJ2565 最长双回文串 【Manacher】
BZOJ2565 最长双回文串 Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"c ...
- BZOJ 2565: 最长双回文串 [Manacher]
2565: 最长双回文串 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1842 Solved: 935[Submit][Status][Discu ...
- BZOJ.2565.[国家集训队]最长双回文串(Manacher/回文树)
BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长 ...
- bzoj 2565: 最长双回文串 manacher算法
2565: 最长双回文串 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem. ...
- [国家集训队]最长双回文串 manacher
---题面--- 题解: 首先有一个直观的想法,如果我们可以求出对于位置i的最长后缀回文串和最长前缀回文串,那么我们枚举分界点然后合并前缀和后缀不就可以得到答案了么? 所以我们的目标就是求出这两个数列 ...
- 【bzoj2565】最长双回文串 Manacher+树状数组
原文地址:http://www.cnblogs.com/GXZlegend/p/6802558.html 题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc ...
- BZOJ2565: 最长双回文串(Manacher)
Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T, ...
随机推荐
- VirtualBox虚拟机扩容
1. 在VBox下增加储存 如图,未扩容前是40G 打开cmd命令行(win+r 输入cmd打开) 将目录切换到virtual的安装目录 cd C:\Program Files\Oracle\Vir ...
- ecshop报错”Deprecated: Assigning the return value of…”解决办法
ECSHOP生成站点地图提示”Deprecated: Assigning the return value of new by reference is deprecated in…”. 我的问题在批 ...
- SPD
一般是在内存条上的.1.SPD是SERIAL PRESENCE DETECT的缩写,中文意思是模组存在的串行检测.也即是通过上面讲的IIC串行接口的EEPROM对内存插槽中的模组存在的信息检查.这样的 ...
- KVM部署LVS集群故障案例一则
一.故障现象 KVM部署LVS(Linux Virtual Server)集群后,能够单独以HTTP方式访问RS(Real Server)的实际IP,但无法通过VIP(Virtual IP)访问. 二 ...
- redis储存中文,客服端读取出现乱码
[root@cache03 ~]# redis-cli -h 192.168.1.112 -p 6379 192.168.1.112:6379> set chen 陈林 OK 192.168.1 ...
- java 高精度 四则运算
java的大数处理对于ACM中的大数来说,相当的简单啊: 整数的运算 BigInteger 小数的运算 BigDecimal 导入类: import java.util.Scanner; im ...
- line: 1: Syntax error: word unexpected (expecting ")")
开发板上运行可执行程序报出错误: line1: 1: Syntax error: word unexpected (expecting ")") 解决思路: 1.编译器的问题 用a ...
- 基于jquery的适合电子商务网站首页的图片滑块
今天给大家分享一款基于Sequence.js 的图片滑动效果,特别适合电子商务网站或者企业产品展示功能.带有图片缩率图,能够呈现全屏图片浏览效果.结合 CSS3 Transition 实现响应式的滑块 ...
- linux -- camera shot 拍照功能
#include <stdio.h> #include <string.h> #include <errno.h> #include <stdlib.h> ...
- C++基本功之Operator
废话不多说,这次讲的是 Operator overload. 关于operator, 在 < The C++ Programing Language > 里的描述,可以用做overload ...