【BZOJ2565】最长双回文串 (Manacher算法)
题目:
BZOJ2565
分析:
首先看到回文串,肯定能想到Manacher算法。下文中字符串\(s\)是输入的字符串\(str\)在Manacher算法中添加了字符‘#’后的字符串 (构造方式如下)
string s = "#";
for (int i = 0; i < str.size(); i++)
{
s += str[i];
s += '#';
}
如果用\(maxl_i\)表示以第\(i\)个字符结尾的最长回文串的长度,\(maxr_i\)表示以第\(i\)个字符开头的最长回文串的长度,那么题目中要求的可以转化为在\(s\)中找一个位置\(i\),满足\(s_i\)是'#'且\(maxl_i+maxr_i\)最大。在原串\(str\)中,它是两个长度分别为\(\frac{maxl_i-1}{2}\)和\(\frac{maxr_i-1}{2}\)的回文串 (要减掉额外加进去的'#'字符) 。因此,算出\(maxl\)和\(maxr\)后,就可以枚举所有'#'字符来得到答案。
怎么算\(maxl\)和\(maxr\)呢?对于一个位置\(pos\),显然以它结尾的最长回文串的中心是一个最小的\(i\)满足\(pos-i<=p_i\) (\(p_i\)是Manacher中求出的以\(i\)为中心的回文串的“半径”),此时\(maxr_{pos}=(pos-i)*2+1\)。那么带着单调队列从左往右扫一遍就能算出\(maxr\),详见代码。同理,从右往左扫一遍可以算出\(maxl\)
代码:
我WA一下午,只因为局部变量没初始化……
#include <iostream>
#include <string>
using namespace std;
namespace zyt
{
const int M = 1e5 * 2 + 10;
int p[M];
void manacher(const string &str)
{
string s = "#";
int id = 0, right = 0;
for (int i = 0; i < str.size(); i++)
{
s += str[i];
s += '#';
}
for (int i = 0; i < s.size(); i++)
{
if (i < right)
p[i] = min(p[id * 2 - i], right - i);
else p[i] = 1;
while (i - p[i] >= 0 && i + p[i] < s.size() && s[i - p[i]] == s[i + p[i]])
p[i]++;
if (i + p[i] > right)
right = i + p[i], id = i;
}
}
inline int abs(const int x)
{
return x >= 0 ? x : -x;
}
void mk_max(int *maxx, const int len, const bool flag)
{
static int q[M];
int h = 0, t = 0;
for (int i = 0; i < len; i++)
{
int pos = flag ? i : len - i - 1;
q[t++] = pos;
while (h < t && abs(pos - q[h]) >= p[q[h]])
h++;
maxx[pos] = abs(pos - q[h]) * 2 + 1;
}
}
void work()
{
string s;
static int maxl[M], maxr[M];
ios::sync_with_stdio(false);
cin >> s;
manacher(s);
mk_max(maxl, s.size() * 2 + 1, true);
mk_max(maxr, s.size() * 2 + 1, false);
int ans = 0;
for (int i = 0; i < s.size() * 2 + 1; i += 2)
if (maxl[i] > 1 && maxr[i] > 1)
ans = max(ans, (maxl[i] - 1) / 2 + (maxr[i] - 1) / 2);
cout << ans << endl;
}
}
int main()
{
zyt::work();
return 0;
}
【BZOJ2565】最长双回文串 (Manacher算法)的更多相关文章
- bzoj 2565: 最长双回文串 manacher算法
2565: 最长双回文串 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem. ...
- BZOJ2565:最长双回文串(Manacher)
Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同). 输入长度为n的串S,求S的最长双回文子串T ...
- BZOJ2565最长双回文串——manacher
题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T,即可将T分为两 ...
- luoguP4555 [国家集训队]最长双回文串 manacher算法
不算很难的一道题吧.... 很容易想到枚举断点,之后需要处理出以$i$为开头的最长回文串的长度和以$i$为结尾的最长回文串的长度 分别记为$L[i]$和$R[i]$ 由于求$R[i]$相当于把$L[i ...
- BZOJ2565 最长双回文串 【Manacher】
BZOJ2565 最长双回文串 Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"c ...
- 【BZOJ2565】最长双回文串 Manacher
[BZOJ2565]最长双回文串 Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为 ...
- BZOJ 2565: 最长双回文串 [Manacher]
2565: 最长双回文串 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1842 Solved: 935[Submit][Status][Discu ...
- BZOJ.2565.[国家集训队]最长双回文串(Manacher/回文树)
BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长 ...
- [国家集训队]最长双回文串 manacher
---题面--- 题解: 首先有一个直观的想法,如果我们可以求出对于位置i的最长后缀回文串和最长前缀回文串,那么我们枚举分界点然后合并前缀和后缀不就可以得到答案了么? 所以我们的目标就是求出这两个数列 ...
随机推荐
- vue中axios设置
//设置默认全局baseURL axios.defaults.baseURL=process.env.BASE_API; //设置默认全局携带浏览器cookie axios.defaults.with ...
- CSC
CSC CSC Table of Contents 1. account 2. Contacts 3. <国家公派留学人员预订回国机票说明> 4. 回国手续 4.1. 申办及开具<留 ...
- 51nod1485 字母排序
[题解] 开26棵线段数,记录区间内每种字母的出现次数,修改的时候就用区间设置为一个数操作即可.同时也有平衡树做 #include<cstdio> #include<algorith ...
- tomcat配置虚拟目录实现无项目名访问项目,域名直接访问
1.tomcat下新建文件夹名为 myapp,把编译后的项目放入该文件夹,不是war包. 2.conf/Catalina/localhost目录下,新建一个ROOT.xml文件,写入类似于如下内容 & ...
- noip模拟赛 读
分析:感觉很像是贪心,但是直接贪找不到方法.一个暴力的想法是枚举最小步数,然后看每个指针能够覆盖到的位置,看看能不能覆盖到所有点.这个求最大覆盖就有点贪心的思想,因为给的ai,bi都是递增顺序的,考虑 ...
- 写给对<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">迷惑不解的小伙伴
1.X-UA-Compatible X-UA-Compatible是自从IE8新加的一个设置,对于IE8以下的浏览器是不识别的. 通过在meta中设置X-UA-Compatible的值,可以指定网页的 ...
- cogs—— 310. [POJ2395] Out of Hay
310. [POJ2395] Out of Hay ★☆ 输入文件:outofhay.in 输出文件:outofhay.out 简单对比 时间限制:1 s 内存限制:128 MB De ...
- Bootstrap基础教程:tutorialspoint-bootstrap
来自turorialspoint的Boostrap基础教程(英文),官网:https://www.tutorialspoint.com/bootstrap/index.htm 中文版:https:// ...
- Spring MVC中@RequestMapping注解使用技巧(转)
@RequestMapping是Spring Web应用程序中最常被用到的注解之一.这个注解会将HTTP请求映射到MVC和REST控制器的处理方法上. 在这篇文章中,你将会看到@RequestMapp ...
- JavaScript解析顺序和变量作用域
JavaScript基础之变量作用域. 一. 1.全局变量:全局变量的意思就是,在代码的不论什么地方都能够訪问到.注意:未定义 直接赋值的变量拥有全局属性. 2.局部变量:局部变量的意思就是,变量的作 ...