【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的最长后缀回文串和最长前缀回文串,那么我们枚举分界点然后合并前缀和后缀不就可以得到答案了么? 所以我们的目标就是求出这两个数列 ...
随机推荐
- linux动态库加载路径修改
1.在 /etc/ld.so.conf 文件中添加搜索路径,重启或者 ldconfig 生效: 2.在 /etc/ld.so.conf.d 目录下添加 *.conf 文件,其中可以添加搜索路径,重启获 ...
- 洛谷 3979 BZOJ 3083 遥远的国度
[题解] 这道题除去根操作就是普通的树链剖分了.但是有换根操作怎么处理呢? 我们可以发现如果现在的根不在查询的点的子树里,那么对本次查询没有影响.如果现在的跟在查询的点x的子树里,那么答案将变为整棵树 ...
- Crackme3 破解教程
Crackme3 破解教程 1.先用PEiD对 Crackme3进行 壳测试 点击File右边的按钮,选中Crackme3 结果如下图所示: 即 无壳. 试运行软件 点击 Register now! ...
- Qos management
本文基于oracle 11.0.2.3. 主要介绍什么叫Qos management.本文包括以下内容: 什么是 Oracle Database QoS Management? 使用QoS Manag ...
- [Dart] Understand Variables and Constants in Dart
In this lesson, we will look at how to create variables and constants. These are containers that sto ...
- PL/SQL个人学习笔记
资料1 -- Created on 2014/8/20 declare -- Local variables here i integer; begin i := 12; -- T ...
- 批量配置SSH 免密钥登录脚本
[root@c3-zabbix-serv hurl]# cat sendsshkey.sh #!/bin/bash if [ -z $1 ]; then echo "Usage : ...
- android note【转】
本文转载自:http://blog.csdn.net/u012719256/article/details/52094982 1.重要的property属性 #define ANDROID_RB_PR ...
- (函数即服务)Faas的现状与未来
刚看到jolestar一位从法律转行程序员的前辈写了一篇Faas现状与未来的文章,里面很多观点都很有启发,或许正如他说的那样,由于Faas能较好的解决资源利用率和开发效率问题,2018年Faas将变得 ...
- 如何在vue项目中引入阿里巴巴的iconfont图库
1. 打开 http://www.iconfont.cn/ 2. 选择我们喜欢的图标,点击上面的小车,加入图标库,即右侧的购物车 3.点击购物车,点击下载代码 4.解压下载的文件夹,将文件夹复制到 a ...