【题目大意】

输入长度为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. 极致的 Hybrid:航旅离线包再加速!(转)

    资源离线的思路简单.场景复杂,最复杂的就是 H5 活动页面的离线化.Mobile Web 在弱网提速的唯一的办法就是坚决杜绝不必要的(运行时)网络请求,即除了 Json 格式的动态数据和其携带的商品配 ...

  2. spring cloud ribbon 断路器

    @EnableDiscoveryClient @SpringBootApplication @EnableCircuitBreaker //开启断路器 public class ConsumerMov ...

  3. pandas中DataFrame使用

    切片选择 #显示第一行数据print(df.head(1)) #显示倒数三行数据 print(df.tail(3)) loc  df.loc[row_index,col_index]  注意loc是根 ...

  4. 关于解决coursera视频缓冲问题

    关于解决coursera视频缓冲问题 之前使用coursera,不FQ的话,视频根本加载不出来,于是每次都FQ过去看的视频.后来发现可以直接修改hosts就可以了. 以下方法来源知乎的回答(侵删). ...

  5. vue路由-动态路由和嵌套路由

    一.动态路由 我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件.例如,我们有一个 User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染.那么,我们可以在 vue-route ...

  6. Django rest framework 版本控制(源码分析)

    基于上述分析 #2.处理版本信息 处理认证信息 处理权限信息 对用户的访问频率进行限制 self.initial(request, *args, **kwargs) #2.1处理版本信息 #versi ...

  7. 关于shutdown和close

    示例代码: void str_cli(FILE *fp, int sockfd) { pid_t pid; char sendline[MAXLINE], recvline[MAXLINE]; ) { ...

  8. Linux 入门记录:十三、Linux 扩展权限

    一.默认权限 每一个终端都有一个 umask 属性,是用来确定新建文件或目录的默认权限的“掩码”(mask 有“掩码”的含义,至于 u,后面说). Linux 中一般有默认的权限掩码,使用命令 uma ...

  9. pxc群集搭建

    pxc群集搭建 1.环境 Percona-XtraDB 5.7.22-22-29.26-log percona-xtrabackup-24-2.4.12 192.168.99.210:3101(第一节 ...

  10. 2017多校第7场 HDU 6129 Just do it 找规律

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6129 题意:求a序列后m次xor前缀和 解法: 手动对1位置对每个位置的贡献打表发现 第一次 贡献为 ...