初涉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 ...
随机推荐
- 关于spring的简概
一.Spring入门操作 IOC 创建对象 <bean id="user" class="com.itheima.domain.User">< ...
- hdu5884
#include <cstdio> #include <queue> #include <algorithm> #include <string.h> ...
- Hive进阶_Hive数据的导入
使用Load语句执行数据的导入 语法: load data [local] inpath 'filepath' [overwrite] into table tablename [partition ...
- Spark Mllib里如何程序输出数据集的条数(图文详解)
不多说,直接上干货! 具体,见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的第17章 决策树多元分类UCI Covertype数据集
- HangFire 定时任务
https://www.cnblogs.com/ecin/p/6201262.html#%E5%9F%BA%E4%BA%8E%E9%98%9F%E5%88%97%E7%9A%84%E4%BB%BB%E ...
- pytorch 0.3 win7 安装
pytorch 0.3 win7 安装 参考这个文章:https://github.com/peterjc123/pytorch-scripts 首先安装 conda 这个链接下载: python 3 ...
- c#基础值类和引用类型_字符串
值类型和引用类型区别:1.值类型和引用类型在内存上存储的地方不一样.2.在传递值类型和传递引用类型的时候,传递的方式不一样.值类型我们称之为值传递,引用类型我们称之为引用传递.我们学的值类型和引用类型 ...
- AJPFX总结Java 类加载器
顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java ...
- 【踩坑】spring每次请求后session不一样导致无法在服务器保存信息
根据网上的资料,若想在服务器用session保存一些信息,方法如下: public Xclass Xmethod(HttpServletRequest request, HttpSession ses ...
- 链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "Cannot start more transactions on this session."
开发同事反馈一个SQL Server存储过程执行的时候,报"链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 ...