由一个题引入:

求一个串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相关推荐

  1. manacher算法----O(n)最长回文串

    manacher算法----O(n)最长回文串 分类:字符串 (126)  (0)  举报  收藏 manacher的时间复杂度为O(n),后缀数组好像可以处理O(nlogn),但是有些变态题目可能卡 ...

  2. bzoj 2565: 最长双回文串 manacher算法

    2565: 最长双回文串 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem. ...

  3. 谈谈我对Manacher算法的理解

    Manacher算法其实是求字符串里面最长的回文. ①在学习该算法前,我们应该知道回文的定义:顺序读取回文和逆序读取回文得到的结果是一样的,如:abba,aba. 那么我们不难想到,在判断一个字符串s ...

  4. 【字符串】manacher算法

    Definition 定义一个回文串为从字符串两侧向中心扫描时,左右指针指向得字符始终相同的字符串. 使用manacher算法可以在线性时间内求解出一个字符串的最长回文子串. Solution 考虑回 ...

  5. 「BZOJ 2342」「SHOI 2011」双倍回文「Manacher」

    题意 记\(s_R\)为\(s\)翻转后的串,求一个串最长的形如\(ss_Rss_R\)的子串长度 题解 这有一个复杂度明显\(O(n)\)的做法,思路来自网上某篇博客 一个双倍回文串肯定当且仅当本身 ...

  6. BZOJ 2084 [Poi2010]Antisymmetry(manacher)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2084 [题目大意] 对于一个01字符串,如果将这个字符串0和1取反后, 再将整个串反过 ...

  7. 【BZOJ-2342】双倍回文 Manacher + 并查集

    2342: [Shoi2011]双倍回文 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1799  Solved: 671 [Submit][Sta ...

  8. Manacher算法 , 实例 详解 . NYOJ 最长回文

    51 Nod http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 Manacher 算法 定义数组 p[i]表示以i为 ...

  9. zoj4110 Strings in the Pocket(manacher)

    传送:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意:给定两个串$S$和$T$,可以翻转$S$串中的任意一个子段, ...

  10. BZOJ 2342 [Shoi2011]双倍回文(manacher+并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2342 [题目大意] 记Wr为W串的倒置,求最长的形如WWrWWr的串的长度. [题解] ...

最新文章

  1. 一起学WP7 XNA游戏开发(三.二 Sprite Texture Font)
  2. mysql宠物种类表,mysql中的表操作
  3. 关于Jquery中ajax方法data参数用法
  4. [PY3]——字符串的分割、匹配、搜索方法总结
  5. oracle 产看执行计划_ODBA 技能SPM计划
  6. 5gh掌上云计算认证不通过_【众志成城战疫情】法官助理告诉你“移动微法院”、“掌上法庭”有多便捷、有多硬核~!...
  7. slurm安装配置_安装Slurm_鲲鹏高性能计算解决方案_安装指南_Slurm 18.08.7 安装指南_Slurm的安装配置_华为云...
  8. 编程基础知识真的是九阳神功吗?
  9. web前端的十种jquery特效及源码下载
  10. 这10道大厂Java面试题,我敢打赌90%的人都不会!!!
  11. 从零开始带你成为消息中间件实战高手_系统化开课了,电子入门一切从零开始,喜欢电子的有机会学习了...
  12. 抓linux肉鸡漏洞,利用MS08067远程溢出漏洞抓肉鸡(3)
  13. X264编码h264
  14. 一只兔子帮你理解KNN
  15. r720服务器独立显卡显示,dell服务器进入bios独立显卡(dellr720安装独立显卡)
  16. WebRtc视频特效
  17. 为什么我的MATLAB激活成功后打开还是激活界面
  18. Oracle:2、SQL基础
  19. 单片机编程软件很简单(五),keil单片机编程软件变量用法(下)
  20. 计算机会计期末考试试题题量及构成,计算机会计

热门文章

  1. jquery下拉分页
  2. sqlserver 查找数据混排
  3. 移动网站用backbone还是angular?
  4. ubuntu中切换到root账号方法
  5. 大话网站---从Hello World到高并发网站
  6. Java读取、创建xml(通过dom方式)
  7. flex 读取外部txt文件时候出现中文乱码现象
  8. bzoj1816: [Cqoi2010]扑克牌
  9. 深度学习解决多视图非线性数据特征融合问题
  10. 【BZOJ2631】tree (LCT)