思路

manache的板子
manacher是一种能在O(n)的时间复杂度内求出最长回文子串的一种算法
首先要在每个串之间加上'#',使得奇数长度和回文串和偶数长度的回文串可以被统一考虑
之后要在首位加上'%',便于对出现位置进行讨论
比如axa变为%#a#x#a#'\0'
算法过程和p[i](表示以i为中心的最长回文子串的半径)相关
画图发现,i为中心的最长回文子串的长度是p[i]-1,开始位置是(i-p[i])/2
然后manacher算法的核心就是这句

p[i]=(mx>i)?min(p[2*id-i],mx-i):1

mx是回文串右端点能延伸到的最远的位置,id是右端点能延伸到的最长回文串的中间位置,
如果mx-i>p[2*id-i],证明相对于id和i对称的回文串被id完全包括,由id的对称性可知p[i]=p[2*id-i]
如果mx-i<p[2*id-i],证明没有被完全包括,最长的回文最少是mx-i,然后由后面的while循环继续匹配
如果mx<=i,则无法做出任何假设,只能让p[i]=1然后由后面的while暴力匹配

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 11000100;
char s[MAXN];
int n,p[MAXN*2];
int manacher(char *s){char t[MAXN*2];int cnt=0,ans=0,id=0,mx=0;t[cnt++]='$';t[cnt++]='#';for(int i=1;i<=n;i++){t[cnt++]=s[i];t[cnt++]='#';}for(int i=0;i<=cnt;i++){p[i]=(mx>i)?min(p[2*id-i],mx-i):1;while(t[i-p[i]]==t[i+p[i]])p[i]++;if(i+p[i]>mx){mx=i+p[i];id=i;}if(p[i]-1>ans)ans=p[i]-1;}return ans;
}
int main(){scanf("%s",s+1);n=strlen(s+1);printf("%d\n",manacher(s));return 0;
}

转载于:https://www.cnblogs.com/dreagonm/p/10510871.html

P3805 【模板】manacher算法相关推荐

  1. 模板 manacher算法

    字符串的最长回文串长度O(N)算法. 主要是利用了回文串的对称性,利用已有的子串更新答案. 然后拓展答案. 详细讲解还是问dalao吧 我是蒟蒻QAQ 代码(luoguP3805) 1 #includ ...

  2. P3805 【模版】manacher算法(manacher)

    P3805 [模版]manacher算法 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a ...

  3. Manacher 算法模板

    简介 在字符串的题目中,有时会遇上 回文串 这样一个名词 顾名思义,回文串 就是 正读和反读都一样的字符串 而 最长回文子串 ,就是在一个字符串的所有子串中,是回文串且长度最长的那个 求最长回文子串最 ...

  4. 最长回文(Manacher算法模板)

    题目描述 给出一个只由小写英文字符a,b,c-y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case,不超过120组,每 ...

  5. manacher算法学习(求最长回文子串长度)

    Manacher总结 我的代码 学习:yyb luogu题目模板 xzy的模板 #include<iostream> #include<cstdlib> #include< ...

  6. 字符串-Manacher算法(你知道马拉车算法吗?)

    文章目录 原理 奇偶问题 p[]数组 马拉车求p[] 模板 例题 P3805 [模板]manacher算法 P1659 拉拉队排练 原理 马拉车算法当然不是马拉着车的奇奇怪怪的东西,是Manacher ...

  7. 牛客练习赛 57——manacher算法 树形dp?

    A - Tic-Tac-Toe 直接考虑每个人8种赢的情况即可. #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragm ...

  8. Manacher算法 - 求最长回文串的利器

    求最长回文串的利器 - Manacher算法 Manacher主要是用来求某个字符串的最长回文子串. 不要被manacher这个名字吓倒了,其实manacher算法很简单,也很容易理解,程序短,时间复 ...

  9. HDU3068 最长回文【manacher算法】

    最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

最新文章

  1. js 打开窗口window.open
  2. 数字IC设计bilibili-Designer Compiler的理论笔记+实操
  3. linux游戏脚本,ubuntu 新手一键配置脚本
  4. matlab 十六进制数组,【MATLAB】MATLAB中读取二进制数据文件并加入到矩阵中
  5. 一个SAP开发人员2017年在编程和游泳上的双重修炼过程
  6. 深入理解mysql系列_深入理解MySQL系列之锁
  7. C/C++代码优化方法
  8. jquery-窗口滚动事件-属性操作
  9. NMEA码详解【转】
  10. 人类为何喜欢十进制的数
  11. Qt 5——常用控件(QLable、QLineEdit、)
  12. win10sas安装教程_Android Studio详细安装教程
  13. 加班申请 ----中间表--系统自动算出---可调休天数
  14. 西部数据硬盘序列号查询网站
  15. 怎么样使父元素的overflow:hidden不影响到子级absolute绝对定位元素
  16. [笔记]c++Windows平台代码规范
  17. 商业计划书范文3000_商业计划书范文
  18. Speedoffice(Excel)中如何标记重复内容
  19. 普通型数控机床 如数控车床、数控铣床、数控磨床
  20. 金蝶天燕行政事业GKIS标准版10.0 金蝶天燕GKIS标准版V10.0 金蝶天燕V9.0 金蝶GKIS高级版9.0 金蝶KIS行政事业14.0 13.0 12.1 行政事业12.0 11.0 9.0

热门文章

  1. Git账号以及TortoiseGit配置
  2. http介绍(3)http1.0 和http1.1 区别
  3. 第七节 VMware View 6.0 菜鸟入门 Composer 安装和部署
  4. C#ASP.NET执行BAT批处理代码
  5. 严重红色警告-虾子+维C=砒霜
  6. Android 中点击某个按钮实现 返回键 的功能
  7. Nuxt(一) Nuxt初步认识
  8. Spring源码学习:day2
  9. [NOI2012(bzoj2879)(vijos1726)]美食节 (费用流)
  10. UILabel自适应高、宽