初涉manacher
一直没有打过……那么今天来找几道题打一打吧
manacher有什么用
字符串的题有一类是专门关于“回文”的。通常来说,这类问题要么和一些dp结合在一起;要么是考察对于manacher(或其他如回文自动机)的理解。
裸的manacher则是解决形如“一个字符串内最长回文串长度”的问题。
一些例题
luoguP3805 【模板】manacher算法
题目描述
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
字符串长度为n
输入输出格式
输入格式:
一行小写英文字符a,b,c...y,z组成的字符串S
输出格式:
一个整数表示答案
输入输出样例
aaa
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
输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串。
Input
一行由小写英文字母组成的字符串S。
Output
Sample Input
Sample Output
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
Input
Output
Sample Input
abacada
abcdef
Sample Output
2
5
HINT
题目分析
沿用上一题的做法,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的更多相关文章
- HDU3068 回文串 Manacher算法
好久没有刷题了,虽然参加过ACM,但是始终没有融会贯通,没有学个彻底.我干啥都是半吊子,一瓶子不满半瓶子晃荡. 就连简单的Manacher算法我也没有刷过,常常为岁月蹉跎而感到后悔. 问题描述 给定一 ...
- manacher算法专题
一.模板 算法解析:http://www.felix021.com/blog/read.php?2040 *主要用来解决一个字符串中最长回文串的长度,在O(n)时间内,线性复杂度下,求出以每个字符串为 ...
- BZOJ2342 Manacher + set
题一:别人介绍的一道题,题意是给出一个序列,我们要求出一段最常的连续子序列,满足:该子序列能够被平分为三段,第一段和第二段形成回文串,第二段和第三段形成回文串. 题二:BZOJ2342和这题非常的相似 ...
- lintcode最长回文子串(Manacher算法)
题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...
- Manacher's algorithm
Manacher's algorithm 以\(O(n)\)的线性时间求一个字符串的最大回文子串. 1. 预处理 一个最棘手的问题是需要考虑最长回文子串的长度为奇数和偶数的情况.我们通过在任意两个字符 ...
- 1089 最长回文子串 V2(Manacher算法)
1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 回文串是指aba.abba.cccbccc.aaaa ...
- Manacher's Algorithm 马拉车算法
这个马拉车算法Manacher‘s Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这 ...
- 51nod1089(最长回文子串之manacher算法)
题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 题意:中文题诶~ 思路: 我前面做的那道回文子串的题 ...
- HDU - 3948 后缀数组+Manacher
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3948 题意:给定一个字符串,求字符串本质不同的回文子串个数. 思路:主要参考该篇解题报告 先按照man ...
随机推荐
- React `controlled` 及 `uncontrolled` 组件
通过 props 来设置其 value 值的组件便是一种 controlled 组件.典型的 form 表单中,像 输入框 <input> 下拉框 <select> 多选框 & ...
- Java与Javac版本不一致问题解决方案
问题:在自己电脑上运行java -version和javac -version,发现java版本不一致,然后查看了环境变量,JAVA_HOME 是 C:\Program Files(x86)\Java ...
- C# File和fileinfo类
两个类功能差不多,File是静态方法实现的,Fileinfo通过实例方法实现的: 文件操作例子: using System; using System.Collections.Generic; usi ...
- storm maven-shade-plugin
storm-core pom <plugin> <groupId>org.apache.maven.plugins</groupId> <artifact ...
- ADC5513
一 C5513 u32 ADC5513_GetValue(void){ u32 ADValue,i; bool data_bit = false; C5513_SCK=0; C5513_CS ...
- Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html
操作数据库的时候,老是提示:Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your ow ...
- MVC中验证码的简单使用
首先新建一个MVC项目 添加类:验证码帮助类(ValidateCodeHelper) using System; using System.Collections.Generic; using Sys ...
- HandlerMapping执行过程。。。
1.web.xml DispatcherServlet 类 寻址 doDispatch() 2.getHandler(requset) 点击,进入 3.HandlerMapping hm=xxxxxx ...
- JsonModel&AFNetWorking
// HttpManager.h // JsonModel&AFNetWorking // // Created by qianfeng on 15/7/21. // Copyright (c ...
- Java中的switch语句——通过示例学习Java编程(8)
作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=19 当我们在代码逻辑中有多个选项,而且需要为每个选 ...