一直没有打过……那么今天来找几道题打一打吧

manacher有什么用

字符串的题有一类是专门关于“回文”的。通常来说,这类问题要么和一些dp结合在一起;要么是考察对于manacher(或其他如回文自动机)的理解。

裸的manacher则是解决形如“一个字符串内最长回文串长度”的问题。

一些例题

luoguP3805 【模板】manacher算法

题目描述

给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.

字符串长度为n

输入输出格式

输入格式:

一行小写英文字符a,b,c...y,z组成的字符串S

输出格式:

一个整数表示答案

输入输出样例

输入样例#1:

aaa
输出样例#1:

3

说明

字符串长度len <= 11000000


题目分析

注意f[maxn<<1]

 #include<bits/stdc++.h>
const int maxn = ; int n,f[maxn<<],mid,ans;
char s[maxn],t[maxn<<]; int main()
{
scanf("%s",s+), t[] = '!', t[++n] = '#';
for (int i=; s[i]; i++) t[++n] = s[i], t[++n] = '#';
for (int i=, mx=-; i<n; i++)
{
if (i < mx) f[i] = std::min(f[(mid<<)-i], mx-i);
else f[i] = ;
for (; t[i+f[i]]==t[i-f[i]]; f[i]++);
if (i+f[i] > mx) mx = i+f[i], mid = i;
ans = f[i] > ans?f[i]:ans;
}
printf("%d\n",ans-);
return ;
}

bzoj2565: 最长双回文串

Description

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

Input

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

Output

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

Sample Input

baacaabbacabb

Sample Output

12

HINT

样例说明
从第二个字符开始的字符串aacaabbacabb可分为aacaa与bbacabb两部分,且两者都是回文串。
对于100%的数据,2≤|S|≤10^5


题目分析

枚举断点,并处理出每一个位置所能够作为起点扩展出的最远位置。

有一些挺好的细节:【BZOJ2565】最长双回文串 Manacher

 #include<bits/stdc++.h>
const int maxn = ; int n,ans,mid,f[maxn<<],ls[maxn<<],rs[maxn<<];
char s[maxn],t[maxn<<]; inline void Max(int &x, int y){x = x>y?x:y;}
int main()
{
scanf("%s",s+), t[] = '!', t[++n] = '#';
for (int i=; s[i]; i++) t[++n] = s[i], t[++n] = '#';
for (int i=, mx=-; i<=n; i++)
{
if (i < mx) f[i] = std::min(f[(mid<<)-i], mx-i);
else f[i] = ;
for (; t[i-f[i]]==t[i+f[i]]; f[i]++);
if (i+f[i] > mx) mx = i+f[i], mid = i;
Max(rs[i-f[i]+], f[i]-);
Max(ls[i+f[i]-], f[i]-);
}
for (int i=; i<=n; i+=) Max(rs[i], rs[i-]-);
for (int i=n; i>=; i-=) Max(ls[i], ls[i+]-);
for (int i=; i<=n; i+=)
if (ls[i]&&rs[i]) ans = std::max(ans, ls[i]+rs[i]);
printf("%d\n",ans);
return ;
}

bzoj3790: 神奇项链

Description

母亲节就要到了,小 H 准备送给她一个特殊的项链。这个项链可以看作一个用小写字
母组成的字符串,每个小写字母表示一种颜色。为了制作这个项链,小 H 购买了两个机器。第一个机器可以生成所有形式的回文串,第二个机器可以把两个回文串连接起来,而且第二个机器还有一个特殊的性质:假如一个字符串的后缀和一个字符串的前缀是完全相同的,那么可以将这个重复部分重叠。例如:aba和aca连接起来,可以生成串abaaca或 abaca。现在给出目标项链的样式,询问你需要使用第二个机器多少次才能生成这个特殊的项链。 

Input

输入数据有多行,每行一个字符串,表示目标项链的样式。 

Output

多行,每行一个答案表示最少需要使用第二个机器的次数。 

Sample Input

abcdcba
abacada
abcdef

Sample Output

0
2
5

HINT

每个测试数据,输入不超过 5行 
每行的字符串长度小于等于 50000 

题目分析

沿用上一题的做法,manacher预处理出最远扩展到的位置。之后就是一个贪心的向远处跳的过程。

(好像预处理暴力也行?)

也挺妙的:【BZOJ3790】神奇项链 Manacher+贪心

 #include<bits/stdc++.h>
const int maxn = ; int n,ans,mid,now,nxt,f[maxn<<],rs[maxn<<];
char s[maxn],t[maxn<<]; int main()
{
while (scanf("%s",s+)!=EOF)
{
memset(f, , sizeof f);
ans = n = , t[] = '!', t[++n] = '#';
for (int i=; s[i]; i++) t[++n] = s[i], t[++n] = '#';
for (int i=, mx=-; i<n; i++)
{
if (i < mx) f[i] = std::min(f[(mid<<)-i], mx-i);
else f[i] = ;
for (; t[i+f[i]]==t[i-f[i]]; f[i]++);
if (i+f[i] > mx) mx = i+f[i]-, mid = i;
rs[i-f[i]+] = i+f[i]-;
}
// now = 1, nxt = 0;
// while (rs[now] < n)
// {
// for (int i=now+1; i<=rs[now]; i++)
// if (rs[i] > rs[nxt]) nxt = i;
// ans++, now = nxt;
// }    //这种是不是不行啊……?
now = nxt = rs[]+;
for (int i=; i<=n; i+=)
{
if (i==now) now = nxt, ans++;
nxt = std::max(nxt, rs[i]+);
}
printf("%d\n",ans);
}
return ;
}

END

初涉manacher的更多相关文章

  1. HDU3068 回文串 Manacher算法

    好久没有刷题了,虽然参加过ACM,但是始终没有融会贯通,没有学个彻底.我干啥都是半吊子,一瓶子不满半瓶子晃荡. 就连简单的Manacher算法我也没有刷过,常常为岁月蹉跎而感到后悔. 问题描述 给定一 ...

  2. manacher算法专题

    一.模板 算法解析:http://www.felix021.com/blog/read.php?2040 *主要用来解决一个字符串中最长回文串的长度,在O(n)时间内,线性复杂度下,求出以每个字符串为 ...

  3. BZOJ2342 Manacher + set

    题一:别人介绍的一道题,题意是给出一个序列,我们要求出一段最常的连续子序列,满足:该子序列能够被平分为三段,第一段和第二段形成回文串,第二段和第三段形成回文串. 题二:BZOJ2342和这题非常的相似 ...

  4. lintcode最长回文子串(Manacher算法)

    题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...

  5. Manacher's algorithm

    Manacher's algorithm 以\(O(n)\)的线性时间求一个字符串的最大回文子串. 1. 预处理 一个最棘手的问题是需要考虑最长回文子串的长度为奇数和偶数的情况.我们通过在任意两个字符 ...

  6. 1089 最长回文子串 V2(Manacher算法)

    1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa ...

  7. Manacher's Algorithm 马拉车算法

    这个马拉车算法Manacher‘s Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这 ...

  8. 51nod1089(最长回文子串之manacher算法)

    题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 题意:中文题诶~ 思路: 我前面做的那道回文子串的题 ...

  9. HDU - 3948 后缀数组+Manacher

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3948 题意:给定一个字符串,求字符串本质不同的回文子串个数. 思路:主要参考该篇解题报告 先按照man ...

随机推荐

  1. cmd 中粘贴复制(转)

    1 如右图,右键命令提示符窗口的标题栏,选择属性. 2 选择“编辑选项”里的“快速编辑模式”,并确定之: 3 在弹出的应用选择提示框上选择“保存属性,供以后具有相同标题的窗口使用”: 4 如此你就可以 ...

  2. p标签间距问题

    用<p></p>标签写文本时,控制行与行之间的高度最好用line-height,不要用margin或padding:   因为P标签本身就带有一定的上下间距,且自带的间距在模拟 ...

  3. JS高级学习历程-12

    冒充继承 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/T ...

  4. JavaScript进阶 - 第2章 你要懂的规则(JS基础语法)

    第2章 你要懂的规则(JS基础语法) 2-1什么是变量 什么是变量? 从字面上看,变量是可变的量:从编程角度讲,变量是用于存储某种/某些数值的存储器.我们可以把变量看做一个盒子,盒子用来存放物品,物品 ...

  5. hdu4403- A very hard Aoshu problem(搜索)

    枚举等号的位置,然后暴力搜索一波 这个题本身不难,但它是我第一次使用对拍程序来查找错误,值得纪念. #include<cstdio> #include<string.h> #i ...

  6. 项目打包发布到tomcat中,中文出现乱码

    先吐槽一下,花了我3个小时,心累 本地运行正常,发布时maven插件里要加utf-8编码 https://blog.csdn.net/testcs_dn/article/details/4558379 ...

  7. springcloud-Netflix创建服务消费者

    目录 springcloud-Netflix创建服务消费者 Ribbon 创建服务消费者-Ribbon方式 ribbon的架构 Feign 创建包和基本项目结构 创建Feign访问服务的接口和访问co ...

  8. 设置Cookie最大存活时间

    Cookie和Session都是由Tomcat自动创建的对象,Cookie的默认最大存活时间是 -1 ,即当浏览器关闭时Cookie就消失了:Session的默认最大存活时间是30分钟. 使用Sess ...

  9. uvm_reg_predictor——寄存器模型(十七)

    这是寄存器模型类中唯一派生自uvm_component的类,我们的寄存器模式需要实时,以最接近的方式知道DUT中寄存器的变化,uvm_reg_predictor就是为这个而生的. // TITLE: ...

  10. jquery获取当前被选择的复选框的value的集合

    1.HTML代码 <input type="checkbox" name="productID" value="0"> < ...