P3805 【模板】manacher算法
思路
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算法相关推荐
- 模板 manacher算法
字符串的最长回文串长度O(N)算法. 主要是利用了回文串的对称性,利用已有的子串更新答案. 然后拓展答案. 详细讲解还是问dalao吧 我是蒟蒻QAQ 代码(luoguP3805) 1 #includ ...
- P3805 【模版】manacher算法(manacher)
P3805 [模版]manacher算法 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a ...
- Manacher 算法模板
简介 在字符串的题目中,有时会遇上 回文串 这样一个名词 顾名思义,回文串 就是 正读和反读都一样的字符串 而 最长回文子串 ,就是在一个字符串的所有子串中,是回文串且长度最长的那个 求最长回文子串最 ...
- 最长回文(Manacher算法模板)
题目描述 给出一个只由小写英文字符a,b,c-y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case,不超过120组,每 ...
- manacher算法学习(求最长回文子串长度)
Manacher总结 我的代码 学习:yyb luogu题目模板 xzy的模板 #include<iostream> #include<cstdlib> #include< ...
- 字符串-Manacher算法(你知道马拉车算法吗?)
文章目录 原理 奇偶问题 p[]数组 马拉车求p[] 模板 例题 P3805 [模板]manacher算法 P1659 拉拉队排练 原理 马拉车算法当然不是马拉着车的奇奇怪怪的东西,是Manacher ...
- 牛客练习赛 57——manacher算法 树形dp?
A - Tic-Tac-Toe 直接考虑每个人8种赢的情况即可. #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragm ...
- Manacher算法 - 求最长回文串的利器
求最长回文串的利器 - Manacher算法 Manacher主要是用来求某个字符串的最长回文子串. 不要被manacher这个名字吓倒了,其实manacher算法很简单,也很容易理解,程序短,时间复 ...
- HDU3068 最长回文【manacher算法】
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
最新文章
- js 打开窗口window.open
- 数字IC设计bilibili-Designer Compiler的理论笔记+实操
- linux游戏脚本,ubuntu 新手一键配置脚本
- matlab 十六进制数组,【MATLAB】MATLAB中读取二进制数据文件并加入到矩阵中
- 一个SAP开发人员2017年在编程和游泳上的双重修炼过程
- 深入理解mysql系列_深入理解MySQL系列之锁
- C/C++代码优化方法
- jquery-窗口滚动事件-属性操作
- NMEA码详解【转】
- 人类为何喜欢十进制的数
- Qt 5——常用控件(QLable、QLineEdit、)
- win10sas安装教程_Android Studio详细安装教程
- 加班申请 ----中间表--系统自动算出---可调休天数
- 西部数据硬盘序列号查询网站
- 怎么样使父元素的overflow:hidden不影响到子级absolute绝对定位元素
- [笔记]c++Windows平台代码规范
- 商业计划书范文3000_商业计划书范文
- Speedoffice(Excel)中如何标记重复内容
- 普通型数控机床 如数控车床、数控铣床、数控磨床
- 金蝶天燕行政事业GKIS标准版10.0 金蝶天燕GKIS标准版V10.0 金蝶天燕V9.0 金蝶GKIS高级版9.0 金蝶KIS行政事业14.0 13.0 12.1 行政事业12.0 11.0 9.0
热门文章
- Git账号以及TortoiseGit配置
- http介绍(3)http1.0 和http1.1 区别
- 第七节 VMware View 6.0 菜鸟入门 Composer 安装和部署
- C#ASP.NET执行BAT批处理代码
- 严重红色警告-虾子+维C=砒霜
- Android 中点击某个按钮实现 返回键 的功能
- Nuxt(一) Nuxt初步认识
- Spring源码学习:day2
- [NOI2012(bzoj2879)(vijos1726)]美食节 (费用流)
- UILabel自适应高、宽