Manacher【p4555】 [国家集训队]最长双回文串
题目描述
顺序和逆序读起来完全一样的串叫做回文串。比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同)。
输入长度为 n 的串 S ,求 S 的最长双回文子串 T ,即可将 T 分为两部分 X ,Y,(|X|,|Y|≥1且 X 和 Y 都是回文串。
xjb分析
首先给出双回文串定义:
----双回文串A是指一个可以被拆分成两个部分(B和C)的字符串 A=B+C, 且B和C都是回文串的串, A自己本身可以不是回文串.
看到回文很容易想到manacher算法
其实正解就是manacher (⊙o⊙)…
我相信大家都理解如何去处理字符串的奇偶,所以不再赘述~~
如果不会manacher还是先去敲板子-->manacher
过程:
因为双回文串是可以拼接得到的,
所以我们可以预先处理出来数组RL[i](即代表以i为对称轴的最大回文半径)
然后我们可以定义这么两个东西
1.:l[i]代表i位置所在回文串中的最右端的位置
2.:r[i]代表i位置所在回文串中的最左端的位置
我们可以算出来这个东西。
因此通过左右拼接就可以得到我们的双回文串了
完_(:з」∠)_完
(可能排版不太好,请揍我谅解)
------------------ 代码------------------
#include<bits/stdc++.h>
#define IL inline
#define RI register int
#define N 100010
char s[N<<1],ch[N];
int MaxRight,center,len;
int RL[N<<1],l[N<<1],r[N<<1];
int pos,ans;
int main()
{
std::cin>>ch;
len=strlen(ch);
for(RI i=0;i<len;i++)s[2*i+1]=ch[i];
len=2*len+1;//这里不要忘记变化长度!
RL[0]=1;
for(RI i=1;i<len;i++)
{
if(i<=MaxRight)
RL[i]=std::min(MaxRight-i,RL[2*center-i]);
else
RL[i]=1;
while(i-RL[i]>=0&&RL[i]+i<len&&s[i+RL[i]]==s[i-RL[i]])
++RL[i];
if(i+RL[i]-1>MaxRight)
MaxRight=i+RL[i]-1,center=i;//注意更新操作
}
for(RI i=0;i<len;i++)
for(;pos<=i+RL[i]-1;pos++)
l[pos]=i;//概念和上面讲的一样
pos=len;
for(RI i=len-1;i>=0;i--)
for(;pos>=i-RL[i]+1;pos--)
r[pos]=i;//概念同上面讲的一样
for(RI i=0;i<len;i++)
ans=std::max(ans,abs(l[i]-r[i]));//为了保险 ,貌似可以直接减 emmm
std::cout<<ans;
}
如果哪里写的不好 请私信我emmm
Manacher【p4555】 [国家集训队]最长双回文串的更多相关文章
- Manacher || P4555 [国家集训队]最长双回文串 || BZOJ 2565: 最长双回文串
题面:P4555 [国家集训队]最长双回文串 题解:就.就考察马拉车的理解 在原始马拉车的基础上多维护个P[i].Q[i]数组,分别表示以i结尾最长回文子串的长度和以i开头的最长回文子串的长度 然后就 ...
- P4555 [国家集训队]最长双回文串
P4555 [国家集训队]最长双回文串 manacher 用manacher在处理时顺便把以某点开头/结尾的最长回文串的长度也处理掉. 然后枚举. #include<iostream> # ...
- 洛谷 P4555 [国家集训队]最长双回文串 解题报告
P4555 [国家集训队]最长双回文串 题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为\(n\)的串 ...
- 【洛谷】P4555 [国家集训队]最长双回文串
P4555 [国家集训队]最长双回文串 题源:https://www.luogu.com.cn/problem/P4555 原理:Manacher 还真比KMP好理解 解决最长回文串问题 转化为长度为 ...
- P4555 [国家集训队]最长双回文串(回文树)
题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 n 的串 S ,求 S 的最长双回文子串 T ,即可 ...
- 洛谷 P4555 [国家集训队]最长双回文串(Manacher)
题目链接:https://www.luogu.com.cn/problem/P4555 首先明白两个回文串,那么要使两个回文串成立,那么我们只能把$'#'$作为中间节点. 然后我们跑一边Manache ...
- 洛谷P4555 [国家集训队]最长双回文串(manacher 线段树)
题意 题目链接 Sol 我的做法比较naive..首先manacher预处理出以每个位置为中心的回文串的长度.然后枚举一个中间位置,现在要考虑的就是能覆盖到i - 1的回文串中 中心最靠左的,和能覆盖 ...
- 洛谷 P4555 [国家集训队]最长双回文串
链接: P4555 题意: 在字符串 \(S\) 中找出两个相邻非空回文串,并使它们长度之和最大. 分析: 直接使用马拉车算法求出每个点扩展的回文串.如果枚举两个回文串显然会超时,我们考虑切割一个长串 ...
- BZOJ.2565.[国家集训队]最长双回文串(Manacher/回文树)
BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长 ...
- [国家集训队]最长双回文串 manacher
---题面--- 题解: 首先有一个直观的想法,如果我们可以求出对于位置i的最长后缀回文串和最长前缀回文串,那么我们枚举分界点然后合并前缀和后缀不就可以得到答案了么? 所以我们的目标就是求出这两个数列 ...
随机推荐
- centos6系列问题
一.NetworkManager启动问题 1.由于以后要支持e1000版虚拟化网卡,所有centos6镜像均按照NetworkManager服务,并设置开机自启动 2.虚机启动时,默认是Network ...
- Gluon
推荐一门mxnet的学习框架gluon 首先是学习网址链接gluon 基本环节分成两部分 从0开始(介绍不使用框架,而只使用mxnet来完成神经网络的搭建) gluon实现(介绍使用框架快速搭建神经网 ...
- 1024Studio官网
一.开发背景 在工作室成立之后,一直就想为工作室建设一个网站,这次乘着暑假有足够的空余时间,开始着手建设我们1024studio的官方网站. 二.系统设计 1.系统目标 根据网上查找的相关资料以及与工 ...
- 普通用户操作tomcat项目时报:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program
在使用普通用户更新tomcat项目适合出现这个信息,Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At ...
- python3.6操作mysql
1.通过 pip 安装 pymysql 进入 cmd 输入 pip install pymysql 回车等待安装完成: 安装完成后出现如图相关信息,表示安装成功. 2.测试连接 import ...
- Visual Studio 2017 添加引用报错(未能正确加载ReferenceManagerPackage包)
最近安装了VS2017,在开发时需要添加引用,于是像原来使用vs2012那样直接右键,添加引用,结果弹出一个错误提示“未能完成操作.不支持此接口”.真真是见了鬼了...... google.度娘一顿搜 ...
- Codeforces Round #386 (Div. 2) 746F(set的运用)
题目大意 给出一个歌单(有n首歌),每个歌都有愉悦值和时间,你可以选择从第x首歌开始听(也就是选择连续的一段),并且你可以选择w首歌让它的时间减半,限制时间为k,求最大的愉悦值 首先我们需要贪心一下, ...
- [poj] 3422 Kaka's Matrix Travels || 最小费用最大流
原题 给一个N*N的方阵,从[1,1]到[n,n]走K次,走过每个方格加上上面的数,然后这个格上面的数变为0.求可取得的最大的值. 要求最大值,所以把边权全为负跑最小费用即可.因为只有第一次经过该点的 ...
- HDU 2546 饭卡(01 背包)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 思路:需要首先处理一下的的01背包,当饭卡余额大于等于5时,是什么都能买的,所以题目要饭卡余额最小, ...
- BZOJ5157 [Tjoi2014]上升子序列 【树状数组】
题目链接 BZOJ5157 题解 我们只需计算每个位置为开头产生的贡献大小,就相当于之后每个大于当前位置的位置产生的贡献 + 1之和 离散化后用树状数组维护即可 要注意去重,后面计算的包含之前的,记录 ...