【题目大意】

输入长度为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-最长双回文串的更多相关文章

  1. BZOJ2565 最长双回文串 【Manacher】

    BZOJ2565 最长双回文串 Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"c ...

  2. BZOJ2565:最长双回文串(Manacher)

    Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同). 输入长度为n的串S,求S的最长双回文子串T ...

  3. BZOJ2565最长双回文串——manacher

    题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T,即可将T分为两 ...

  4. BZOJ2565: 最长双回文串(Manacher)

    Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T, ...

  5. p4555&bzoj2565 最长双回文串

    传送门(洛谷) 传送门(bzoj) 题目 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 nnn 的串 SSS ...

  6. bzoj2565: 最长双回文串 pam

    题意:找一个串中的最长连续两个回文子串长度 题解:建两个回文树,一个正着,一个反着,每次add之后last的长度就是后缀最长的回文串长度,然后两边加一遍即可 /******************** ...

  7. bzoj千题计划305:bzoj2565: 最长双回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=2565 正着构造回文自动机 倒过来再构造一个回文自动机 分别求出以位置i开始的和结尾的最长回文串 # ...

  8. 2019.03.02 bzoj2565: 最长双回文串(pam)

    传送门 题意简述:问最长的由两个回文串连接而成最长字串长度. 思路: 正反串各建一个pampampam然后就完了. 代码: #include<bits/stdc++.h> #define ...

  9. bzoj2565: 最长双回文串

    manacher之后乱搞 #include <iostream> #include <cstdio> #include <cstring> #include < ...

随机推荐

  1. bzoj 2730 割点

    首先我们知道,对于这张图,我们可以枚举坍塌的是哪个点,对于每个坍塌的点,最多可以将图分成若干个不连通的块,这样每个块我们可能需要一个出口才能满足题目的要求,枚举每个坍塌的点显然是没有意义的,我们只需要 ...

  2. 【Android XML】Android XML 转 Java Code 系列之 style(3)

    最近一个月把代码重构了一遍, 感觉舒服多了, 但总体开发进度没有变化.. 今天聊聊把style属性转换成Java代码的办法 先说结论: 引用系统style是无法完美的实现的, 我们如果有写成Java代 ...

  3. 64_a2

    arquillian-core-parent-1.1.11-6.fc26.noarch.rpm 10-Feb-2017 13:22 12918 arquillian-core-spi-1.1.11-6 ...

  4. Percona XtraDB Cluster(PXC)原理

    Percona XtraDB Cluster(PXC)原理 介绍: PXC曾经属于一套近乎最完美的mysql高可用集群解决方案(现mgr总体上要优于pxc),相比传统的基于主从复制模式的集群架构MHA ...

  5. nodejs面试题

    1.为什么用Nodejs,它有哪些缺点? 事件驱动,通过闭包很容易实现客户端的生命活期. 不用担心多线程,锁,并行计算的问题 V8引擎速度非常快 对于游戏来说,写一遍游戏逻辑代码,前端后端通用 当然N ...

  6. Canvas 高级

    一.Canvas 高级 1.变换--位移 translate(x, y) 2.变换-缩放 scale(xS, yS) 3.变换-旋转 rotate(弧度) 4.环境的保存和释放 save() rest ...

  7. JVM对象分配和GC分布【JVM】

    最近在学习java基础结构,刚好学到了jvm,总结了以下并可以结合思维导图认识以下Jvm的对象: 栈:什么是栈? 先说一下栈的数据结构吧,栈它是一种先进后出的数据结构(FILO),跟队列刚好相反(先进 ...

  8. sqlserver2008 死锁解决方法及性能优化方法

    sqlserver2008 死锁解决方法及性能优化方法 原文: http://blog.csdn.net/kuui_chiu/article/details/48621939 十步优化SQL Serv ...

  9. 第一次用python编写的小程序

    print ("*******数字游戏*********")temp = input ("猜猜小红现在心里想的是什么数字呢?")guess = int(temp ...

  10. Binary Tree Preorder Traversal——经典算法的迭代求解(前序,中序,后序都在这里了)

    先序遍历,用递归来做,简单的不能再简单了.代码如下: (以下仅实现了先序遍历,中序遍历类似,后序遍历和这两个思路不一样,具体详见Binary Tree Postorder Traversal) /** ...