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

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. CODING 告诉你硅谷的研发项目管理之道(5)

    CODING 已经通过前四期文章,让大家逐步了解了一些硅谷优秀的项目管理者是如何工作.如何维持团队高效运作的.在过去的十几年中,中国的互联网行业发展过于迅猛,导致很多管理人员都是赶鸭子上架,商场如战场 ...

  2. JS高级学习历程-14

    昨天内容回顾 1. 面向对象的私有成员.静态成员 私有成员:在构造函数里边定义局部变量,就是私有成员. 静态成员:在js里边,函数就是对象,可以通过给函数对象声明成员方式声明静态成员. 2. 原型继承 ...

  3. 《SQL 进阶教程》 case:将已有编号方式转换为新的方式并统计

    SQL 权威指南SQL 解惑在进行非定制化统计时,需要将已有编号方式转换为另外一种便于分析的方式进行统计需求 select case when name='哈尔滨' then '黑龙江' when n ...

  4. 页面出现滚动条时,body里面的内容不能自动居中?

    弹窗后允许页面滚动 这种方式通常使用 position: absolute; ,可以看看我做的这个 Demo.主要用来应对弹窗内容很大很多的情况,超过了屏幕的宽高需要产生滚动条来方便浏览者查看.有一些 ...

  5. python进阶06 常用问题库(2)datetime模块 base64

    python进阶06 常用问题库(2)datetime模块 base64 一.datetime模块(时间) 1.datetime.time() t=datetime.time(20,43,30,1) ...

  6. [Android]《Android艺术开发探索》第一章读书笔记

    1. 典型情况下生命周期分析 (1)一般情况下,当当前Activity从不可见重新变为可见状态时,onRestart方法就会被调用. (2)当用户打开新的Activity或者切换到桌面的时候,回调如下 ...

  7. asp.net 多语言 在IIS7.5发布出现找不到资源文件

    我也遇到这个问题,纠结了半天, 最后把资源文件的属性改为:内容 就可以了. 见:http://q.cnblogs.com/q/60443/

  8. 从一个LocalDateTime引发的疑问

    一 公司有同事部署出错,然后查日志,找时间,从k8s得到的时间是  2017-06-16T09:38:48.580 +0000,然后他就纳闷了,因为他根本不会在9点部署好吧,而且9点大多数程序员都没开 ...

  9. Linux环境 Java内存快速查看

    最近生产环境遇到内存老是占用很大的情况,16G的内存Free的内存只剩100多M,仿佛一颗定时炸弹一般,说不定就服务Down了.于是开始网上不断的找查看内存使用的方法.现学现卖,以下通过一个例子来演示 ...

  10. IOC的使用

    1.概要: 在spring中,都是使用反射机制创建对象,将创建对象的权利交给spring容器,就是控制反转(ioc) 对象创建方式 有参构造 无参构造 工厂模式(静态,非静态) 2.创建IDEA控制台 ...