原文地址:http://www.cnblogs.com/GXZlegend/p/6802558.html


题目描述

顺序和逆序读起来完全一样的串叫做回文串。比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同)。
输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串。

输入

一行由小写英文字母组成的字符串S。

输出

一行一个整数,表示最长双回文子串的长度。

样例输入

baacaabbacabb

样例输出

12


题解

个人并不是擅长单调数据结构,于是用了Manacher后写了树状数组,稍微慢了点。

先求出以每个字符为中心的最大回文半径。

然后想办法求以某个字符结尾的最大回文半径,显然s[i]=i-min{j}+1,其中j≤i且j+p[j]-1≥i。

可以用树状数组维护j+p[j]-1≥i的最小的j,其中需要反过来减一下,因为树状数组是向下查询。

这样求出以某个字符结尾的最大回文半径,并得到最大回文长度。

之后同理求出以某个字符开头的最大回文长度。

最后一个向后一个向前加起来求一下就好了。

时间复杂度O(nlogn),存在更优秀的O(n)算法,参考CQzhangyu's blog

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 2000010
using namespace std;
int p[N] , f[N] , s1[N] , s2[N] , n;
char str[N] , tmp[N];
void update1(int x , int a)
{
int i;
for(i = x ; i <= n ; i += i & -i) f[i] = min(f[i] , a);
}
void update2(int x , int a)
{
int i;
for(i = x ; i <= n ; i += i & -i) f[i] = max(f[i] , a);
}
int query1(int x)
{
int i , ans = 0x7f7f7f7f;
for(i = x ; i ; i -= i & -i) ans = min(ans , f[i]);
return ans;
}
int query2(int x)
{
int i , ans = 0;
for(i = x ; i ; i -= i & -i) ans = max(ans , f[i]);
return ans;
}
int main()
{
int i , mx = 0 , last = 0 , ans = 0;
scanf("%s" , str + 1) , n = strlen(str + 1);
tmp[0] = '0';
for(i = 1 ; i <= n ; i ++ ) tmp[i * 2 - 1] = '#' , tmp[i * 2] = str[i];
n = n * 2 + 1 , tmp[n] = '#';
for(i = 1 ; i <= n ; i ++ )
{
if(mx >= i) p[i] = min(p[last * 2 - i] , mx - i + 1);
else p[i] = 1;
while(tmp[i - p[i]] == tmp[i + p[i]]) p[i] ++ ;
if(mx < i + p[i] - 1) mx = i + p[i] - 1 , last = i;
}
memset(f , 0x7f , sizeof(f));
for(i = 1 ; i <= n ; i ++ )
update1(n - (i + p[i] - 1) + 1 , i) , s1[i] = 2 * i - 2 * query1(n - i + 1) + 1;
memset(f , 0 , sizeof(f));
for(i = n ; i >= 1 ; i -- )
update2(i - p[i] + 1 , i) , s2[i] = 2 * query2(i) - 2 * i + 1;
for(i = 2 ; i <= n ; i ++ ) ans = max(ans , (s1[i - 1] + s2[i]) / 2);
printf("%d\n" , ans);
return 0;
}

【bzoj2565】最长双回文串 Manacher+树状数组的更多相关文章

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

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

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

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

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

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

  4. 2021.12.10 P5041 [HAOI2009]求回文串(树状数组求逆序对)

    2021.12.10 P5041 [HAOI2009]求回文串(树状数组求逆序对) https://www.luogu.com.cn/problem/P5041 题意: 给一个字符串 \(S\) ,每 ...

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

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

  6. BZOJ 2565: 最长双回文串 [Manacher]

    2565: 最长双回文串 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1842  Solved: 935[Submit][Status][Discu ...

  7. BZOJ.2565.[国家集训队]最长双回文串(Manacher/回文树)

    BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长 ...

  8. bzoj 2565: 最长双回文串 manacher算法

    2565: 最长双回文串 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem. ...

  9. [国家集训队]最长双回文串 manacher

    ---题面--- 题解: 首先有一个直观的想法,如果我们可以求出对于位置i的最长后缀回文串和最长前缀回文串,那么我们枚举分界点然后合并前缀和后缀不就可以得到答案了么? 所以我们的目标就是求出这两个数列 ...

随机推荐

  1. 3、SpringBoot------邮件发送(1)

    开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/Springboot/tree/8878e8e89ce01ceb967ef8c1193ac740a6 ...

  2. Objection, 一个轻量级的Objective-C依赖注入框架

    简介 项目主页:https://github.com/atomicobject/objection 实例下载: https://github.com/ios122/ios122 Objection 是 ...

  3. JavaScript提高容错的方式

    项目环境为Java Web项目,前端多用jquery,记录碰到的JS提高容错的编写方式. 回调的数据为null,数据绑定过程报错,影响下面代码执行 这种情况一开始想到的是能不能改用前端框架来动态的对页 ...

  4. java.lang.UnsupportedOperationException: Exception occurred during processing request: null

    1.Action有问题,Struts2注解拼写错误,注解包版本不匹配! 2.今天还有一个错误,Tomcat服务器异常,无法启动,Remove/clean后还是无法启动 :极大可能是web.xml 写错 ...

  5. 有一段<script>代码,效果是点击<p>就会弹出信息,但是有的<p>点击会有效果,有的没有效果

    问题:有一段<script>代码,效果是点击<p>就会弹出信息,但是有的<p>点击会有效果,有的没有效果 解决: 页面代码是至上而下执行的,如果你的这个标签在< ...

  6. 基于form表单submit提交不跳转

    方法一:target <html> <body> <form action="" method="post" target=&qu ...

  7. 图解HTTP总结(3)——HTTP报文内的HTTP信息

    HTTP通信过程包括从客户端发往服务端的请求及从服务器端返回客户端的响应. 用于HTTP协议交互的信息被称为HTTP报文.客户端的HTTP报文叫做请求报文,服务器端的叫做响应报文.HTTP报文本身是多 ...

  8. CSS3 Flexbox(伸缩盒/弹性盒模型)可视化指南

    在http://css.doyoe.com/(CSS参考手册)中,本文对应其中的伸缩盒 引入 Flexbox布局官方称为CSS Flexible Box Layout Module是一个CSS3新的布 ...

  9. 1079: [SCOI2008]着色方案

    链接 思路 首先是dp,如果直接用每个种颜色的剩余个数做状态的话,复杂度为5^15. 由于c<=5,所以用剩余数量的颜色的种类数做状态:f[a][b][c][d][e][last]表示剩余数量为 ...

  10. 斐波那契数列(递归)&求100以内的素数

    Java 5 添加了 java.util.Scanner 类,这是一个用于扫描输入文本的新的实用程序.它是以 前的 StringTokenizer 和 Matcher 类之间的某种结合.由于任何数据都 ...