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

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. IDEA热部署自动重启服务问题

    新接手项目过于庞大,从eclipse果断换成了IDEA.因为IDEA有免费的热部署,咳咳咳... 但是,手贱的我在下面这张状态下,直接OK了,TM,这不是我要的热部署啊,这是重新启动啊,但是勾选了do ...

  2. PJzhang:子域名爆破工具wydomain(猪猪侠)

    猫宁!!! 参考链接:https://www.secpulse.com/archives/53182.html https://www.jianshu.com/p/65c85f4b7698 http: ...

  3. JS 检测字符串是否还有某个字符

    function filer(s) { var str = "字符串"; if (str.indexOf(s) == -1) { alert("没有"); } ...

  4. GYM 101572C(模拟)

    要点 题意是:以颜色red举例,逆时针找最近的,顺时针找最近的,相减得到val:对三种颜色都做这事然后求和,卖掉最小的,更新,继续. 360度很小所以就像365天一样可以暴力前后扫.每次更新最多6个所 ...

  5. Codeforces 140D(贪心)

    要点 跟大家打acm的策略一样,为了做更多的题数肯定做最简单的题目,为了罚时更少肯定从易到难做 虽然有个12:00之限不同于往常比赛,但细想还是要从易到难贪:做这些题的总时间肯定是不变的,只是顺序可变 ...

  6. spring boot 使用hibernate validator 验证service

    不在controller中验证,而是在service中验证. spring boot 默认使用的就是hibernate validator,存在于pom的spring-boot-starter-web ...

  7. 单个页面Request编码方式的改变,无需改动Web.config~

    搞一个东西,从别人的接口接一段中文,URL传输,怎么都有乱码~~ 得到对方的编码方式是gb2312,于是用HttpUtility.UrlDecode(_smssend_content, System. ...

  8. js黑科技,使用offsetParent检测元素是否隐藏

    var isHidden = function (element) { return (element.offsetParent === null);}; eg:

  9. android :fragmentation使用中遇到的 NullPointerException

    背景:fragmentation(单ACTIVITY+多个fragments)+brvah(  recyclerView多级自定义菜单功能) 目的:实现  菜单栏的点击,fragment 显示相应的内 ...

  10. 命令方式重新签名apk

    1.(每个指令之间要有一个空格) 注:拿到一个apk后,首先删除META-INF. 1.如果你的电脑装的是jdk1.6,就用下面的命令: 打开命令符,首先直接输入: Jarsigner -keysto ...