题目:

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算法)的更多相关文章

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

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

  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. luoguP4555 [国家集训队]最长双回文串 manacher算法

    不算很难的一道题吧.... 很容易想到枚举断点,之后需要处理出以$i$为开头的最长回文串的长度和以$i$为结尾的最长回文串的长度 分别记为$L[i]$和$R[i]$ 由于求$R[i]$相当于把$L[i ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. HYSBZ - 1050(旅行comf 并查集Java实现)

    HYSBZ - 1050(旅行comf Java实现) 原题地址 解法:枚举每一条边,对于这条边,我们需要找到集合中和其值相差最小的最大边,这个集合是指与包括i边在内的ST联通集.对于这一要求,我们只 ...

  2. MySQL 查询状态

    查询状态 SHOW FULL PROCESSLIST 对于一个连接,或者说一个线程,任何时刻都有一个状态,该状态表示了MySQL当前正在做什么. mysql>SHOW FULL PROCESSL ...

  3. 【Codeforces 242C】King's Path

    [链接] 我是链接,点我呀:) [题意] 让你找到(x0,y0)到(x1,y1)的一条最短路 走过的点必须在所给的n个横向路径上 [题解] 因为n条横向路径上的点最多不会超过10的5次方个,所以我们可 ...

  4. 程序员如何在百忙中更有效地利用时间,如何不走岔路,不白忙(忙得要有效率,要有收获)-----https://www.cnblogs.com/JavaArchitect/p/9080484.html

    https://www.cnblogs.com/JavaArchitect/p/9080484.html 程序员如何在百忙中更有效地利用时间,如何不走岔路,不白忙(忙得要有效率,要有收获)

  5. [BZOJ2594] [Wc2006]水管局长数据加强版(LCT + kruskal + 离线)

    传送门 WC这个题真是丧心病狂啊,就是想学习一下怎么处理边权,给我来了这么一个破题! ORZ hzwer 临摹黄学长代码233 但还是复杂的一匹 理一下思路吧 题目大意:给定一个无向图,多次删除图中的 ...

  6. java并发操作

    项目中常用的java并发操作 一.java8新特性java并发流操作(结合纳姆达表达式) List<String> list = new ArrayList<>(); list ...

  7. win7下安装SQLSERVER2000

    来自为知笔记(Wiz)

  8. centos 如何安装软件

    yum命令 (一)yum基本概念 1)yum是什么 yum = Yellow dog Updater, Modified 主要功能是更方便的添加/删除/更新RPM包. 它能自动解决包的倚赖性问题. 它 ...

  9. Behavioral模式之Interpreter模式

    1.意图 给定一个语言,定义它的文法的一种表示.并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 2.别名 无 3.动机 假设一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各种 ...

  10. android_handler(一)

    仅仅是一个简单的handler的样例,目的就是对handler有一个初步的接触. 在layout上加入一个button,点击按钮,然后打印出利用handler传送的数据.(都是执行在mainthrea ...