【单调队列DP+manacher】BZOJ2565-最长双回文串
【题目大意】
输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串。
【思路】
首先普通地求manacher,然后求出以每个位置为左端点和右端点的最长回文串长度l[i]和r[i]。
l[i]=max{2*(j-i+1)-1}(j+p[j]-1>=i),r[i]同理。显然可以用单调队列维护一下。
*网上好像大家没有用单调队列?我不清楚因为我只想出了单调队列的做法quq
然后枚举一下。为了处理方便,我们只枚举'#'位置,这样能够保证除去该'#',左边字母和'#'数量相等,右边同理。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN=+;
char str[MAXN],s[MAXN*+];
int len,p[MAXN],l[MAXN],r[MAXN]; void init()
{
scanf("%s",str);
s[]='$',s[]='#';
len=strlen(str);
for (int i=,j=;i<len;i++)
{
s[++j]=str[i];
s[++j]='#';
}
} void solve()
{
int mx=,mxid=;
for (int i=;i<*len+;i++)
{
if (i<mx) p[i]=(p[*mxid-i]<=(mx-i))?p[*mxid-i]:(mx-i);
else p[i]=;
while (s[i+p[i]]==s[i-p[i]]) p[i]++;
if (i+p[i]->mx) mx=i+p[i]-,mxid=i;
}
} void dp()
{
queue<int> que1;
for (int i=;i<*len+;i++)
{
while (!que1.empty() && que1.front()+p[que1.front()]-<i) que1.pop();
que1.push(i);
l[i]=*(i-que1.front()+)-;
} queue<int> que2;
for (int i=*len+;i>=;i--)
{
while (!que2.empty() && que2.front()-p[que2.front()]+>i) que2.pop();
que2.push(i);
r[i]=*(que2.front()-i+)-;
}
} void printans()
{
int ans=-;
for (int i=;i<*len+;i++)
if (s[i]=='#')
{
ans=max(ans,(l[i]-)/+(r[i]-)/);
}
printf("%d",ans);
} int main()
{
init();
solve();
dp();
printans();
return ;
}
【单调队列DP+manacher】BZOJ2565-最长双回文串的更多相关文章
- BZOJ2565 最长双回文串 【Manacher】
BZOJ2565 最长双回文串 Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"c ...
- 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)
Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T, ...
- p4555&bzoj2565 最长双回文串
传送门(洛谷) 传送门(bzoj) 题目 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 nnn 的串 SSS ...
- bzoj2565: 最长双回文串 pam
题意:找一个串中的最长连续两个回文子串长度 题解:建两个回文树,一个正着,一个反着,每次add之后last的长度就是后缀最长的回文串长度,然后两边加一遍即可 /******************** ...
- bzoj千题计划305:bzoj2565: 最长双回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=2565 正着构造回文自动机 倒过来再构造一个回文自动机 分别求出以位置i开始的和结尾的最长回文串 # ...
- 2019.03.02 bzoj2565: 最长双回文串(pam)
传送门 题意简述:问最长的由两个回文串连接而成最长字串长度. 思路: 正反串各建一个pampampam然后就完了. 代码: #include<bits/stdc++.h> #define ...
- bzoj2565: 最长双回文串
manacher之后乱搞 #include <iostream> #include <cstdio> #include <cstring> #include < ...
随机推荐
- Python eval 函数说明
eval(str [,globals [,locals ]]) -- 函数将字符串str当成有效Python表达式来求值,并返回计算结果. 例 : eval('3+4') ==> ...
- c#使用selenium+Chromedriver参数配置
using System; //添加selenium的引用 using OpenQA.Selenium.PhantomJS; using OpenQA.Selenium.Chrome; using O ...
- visual studio 个性化设置
尼马visual studio 的注释建设的真垃圾 Ctrl+K+C Ctrl+K+U, 通过工具->选项->环境->键盘->命令包含中搜索“注释选定内容”,分配成 Ctrl+ ...
- 辨别苹果数据线真伪 苹果计算器 Dashboard 知识
辨别苹果数据线真伪 苹果计算器 Dashboard 知识 苹果数据线真伪的最简单的辨别: 线质柔软 用数据线连接适配器(苹果自带的适配器)充电 连接手机 如果该手机数据线是假的, 在手机上会提示”该 ...
- [Deep dig] ViewController初始化过程调查
代码:https://github.com/xufeng79x/ViewControllerLife 1.简介: 介绍xib方式.storyborad方式以及code方式下ViewController ...
- 利用h5,chart.js监测手机三轴加速度,用以研究计步算法等
用window.DeviceMotionEvent来判断手机浏览器是否支持访问硬件资源,window.addEventListener('devicemotion',deviceMotionHandl ...
- linux命令(46):chgrp命令
在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...
- classpath中怎样一次性加入整个目录的jar文件
linux可以通过shell来处理 1 2 3 for jar in $HOME/lib/*.jar; do CLASSPATH=$CLASSPATH:$jar done
- react生命周期函数使用箭头函数,导致mobx-react问题
最近新人加入了项目,遇到了一个很奇怪的问题.mobx observable 属性,onChange的时候就是页面不会刷新. 试来试去,就是不知道什么原因,后来其他同事查到是因为componentWil ...
- centos7yum安装tomcat
执行安装命令 [root@localhost ~]# yum -y install tomcat 查询tomcat是否安装成功 [root@localhost ~]# rpm -q tomcat to ...