关于manacher
由一个题引入:
求一个串A的最长回文串:
A=abababa
最长回文串长度:5(ababa)
先思考用hash怎么做?
一、暴力
枚举左端,右端点(确定一个区间),线性扫一遍当前区间。
Ans=max(ans);
时间复杂度:O(n^3)
貌似也有O(n^2)的暴力,在此不再赘述。
二、哈希
分设两个hash数组, ha1记录前缀, ha2记录后缀。
对于任意[l,r] 若ha1[l,mid]==ha2[mid+1,r],则为回文串
Ans=max(ans);
时间复杂度:O(nlog 2 n)
三、manacher
而manacher算法也可以在O(n)的时间内求出答案
定义数组 p[i]表示以i为中心的(包含i个这个字符)回文串半长。
将字符串s从前扫到后,来计算p[i],则最大的p[i]就是最长回文串长度。
算法流程:
由于s是从前扫描到最后的,所以需要计算p[i]时一定计算好了p[1]~~p[i-1]
假设现在扫描到了i+k这个位置,现在需要计算p[i+k]
定义maxlen是位置i+k位置前所有回文串中能延伸到的最有右端的位置,即maxlen=p[i]+i;
p[i]表示半径长,i 表示目前最长的位置。
有两种情况:
代码:
#include<cstdio> #include<cstring> #include<iostream> #define m(s) memset(s,0,sizeof s); using namespace std; const int N=1e6+5; int l,cas,len,p[N<<1]; char s[N],S[N<<1]; void manacher(){int ans=0,id=0,mx=-1;for(int i=1;i<l;i++){if(id+mx>i) p[i]=min(p[id*2-i],id+mx-i);while(i-p[i]-1>=0&&i+p[i]+1<=l&&S[i-p[i]-1]==S[i+p[i]+1]) p[i]++;if(id+mx<i+p[i]) id=i,mx=p[i];ans=max(ans,p[i]);}printf("Case %d: %d\n",++cas,ans); } int main(){while(scanf("%s",s)==1){if(s[0]=='E') break;len=strlen(s);m(p);m(S);l=-1;for(int i=0;i<len;i++) S[++l]='#',S[++l]=s[i];S[++l]='#';manacher();}return 0; }
关于manacher的应用:
应用1.输入一个字符串Str,输出Str里最长回文子串的长度。 模板的用法
应用2.判断是否能将字符串S分成三段非空回文串。
【输入说明】
第一行一个整数T,表示数据组数。
对于每一个组,仅包含一个由小写字母组成的串。
【输出说明】
对于每一组,单行输出"Yes" 或 "No“
解:
对原串前缀和后缀作一个01标记pre[i],suf[i]表示1-i和i-n能否能形成回文。记以i为中心的回文半径为r(i)。
这些都可以在O(N)时间内求出。也可以使用Hash+二分等方法O(NlogN)内求出。
我们考虑中间一个回文串的位置,不妨设它是奇数长度(偶数类似)。
那么问题变成了求一个i和d使得1<=d<=r(i)且pre[i-d]和suf[i+d]为真。
枚举i,实际上就是问pre[i-r(i)..i-1]和suf[i+1..i+r(i)]取反后这两段有没有一个位置两者均为1,也就是and后不为0,暴力压位即可。
推荐:HDU 5340
一世安宁
转载于:https://www.cnblogs.com/GTBA/p/9451293.html
关于manacher相关推荐
- manacher算法----O(n)最长回文串
manacher算法----O(n)最长回文串 分类:字符串 (126) (0) 举报 收藏 manacher的时间复杂度为O(n),后缀数组好像可以处理O(nlogn),但是有些变态题目可能卡 ...
- bzoj 2565: 最长双回文串 manacher算法
2565: 最长双回文串 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem. ...
- 谈谈我对Manacher算法的理解
Manacher算法其实是求字符串里面最长的回文. ①在学习该算法前,我们应该知道回文的定义:顺序读取回文和逆序读取回文得到的结果是一样的,如:abba,aba. 那么我们不难想到,在判断一个字符串s ...
- 【字符串】manacher算法
Definition 定义一个回文串为从字符串两侧向中心扫描时,左右指针指向得字符始终相同的字符串. 使用manacher算法可以在线性时间内求解出一个字符串的最长回文子串. Solution 考虑回 ...
- 「BZOJ 2342」「SHOI 2011」双倍回文「Manacher」
题意 记\(s_R\)为\(s\)翻转后的串,求一个串最长的形如\(ss_Rss_R\)的子串长度 题解 这有一个复杂度明显\(O(n)\)的做法,思路来自网上某篇博客 一个双倍回文串肯定当且仅当本身 ...
- BZOJ 2084 [Poi2010]Antisymmetry(manacher)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2084 [题目大意] 对于一个01字符串,如果将这个字符串0和1取反后, 再将整个串反过 ...
- 【BZOJ-2342】双倍回文 Manacher + 并查集
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1799 Solved: 671 [Submit][Sta ...
- Manacher算法 , 实例 详解 . NYOJ 最长回文
51 Nod http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 Manacher 算法 定义数组 p[i]表示以i为 ...
- zoj4110 Strings in the Pocket(manacher)
传送:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意:给定两个串$S$和$T$,可以翻转$S$串中的任意一个子段, ...
- BZOJ 2342 [Shoi2011]双倍回文(manacher+并查集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2342 [题目大意] 记Wr为W串的倒置,求最长的形如WWrWWr的串的长度. [题解] ...
最新文章
- 一起学WP7 XNA游戏开发(三.二 Sprite Texture Font)
- mysql宠物种类表,mysql中的表操作
- 关于Jquery中ajax方法data参数用法
- [PY3]——字符串的分割、匹配、搜索方法总结
- oracle 产看执行计划_ODBA 技能SPM计划
- 5gh掌上云计算认证不通过_【众志成城战疫情】法官助理告诉你“移动微法院”、“掌上法庭”有多便捷、有多硬核~!...
- slurm安装配置_安装Slurm_鲲鹏高性能计算解决方案_安装指南_Slurm 18.08.7 安装指南_Slurm的安装配置_华为云...
- 编程基础知识真的是九阳神功吗?
- web前端的十种jquery特效及源码下载
- 这10道大厂Java面试题,我敢打赌90%的人都不会!!!
- 从零开始带你成为消息中间件实战高手_系统化开课了,电子入门一切从零开始,喜欢电子的有机会学习了...
- 抓linux肉鸡漏洞,利用MS08067远程溢出漏洞抓肉鸡(3)
- X264编码h264
- 一只兔子帮你理解KNN
- r720服务器独立显卡显示,dell服务器进入bios独立显卡(dellr720安装独立显卡)
- WebRtc视频特效
- 为什么我的MATLAB激活成功后打开还是激活界面
- Oracle:2、SQL基础
- 单片机编程软件很简单(五),keil单片机编程软件变量用法(下)
- 计算机会计期末考试试题题量及构成,计算机会计