[Manacher]【学习笔记】
终于填坑啦......马拉车
课件上说的好短,但是明白了,讲解稍微修改一下抄上行了,比扩展KMP好写多了
求以每个字符为中心的最长回文串的半径。
如果要求可以以字符间隙为回文中心,就要在每两个字符之间及两端加入一个’#’,然后再解决。
令r[i]为以i为中心的最长回文半径。从左往右依次求r数组。
当前要求r[i],曾经的j+r[j]-1最大是p,对应的下标为a。如果r[2*a-i]+i-1<p,r[i]=r[2*a-i];否则r[i]≥p-i+1,暴力向后扩展。
2*a-i就是i关于a的对称位置,上面那句很显然啊<p的时候就被包括在a为中心的回文串里呀
实现上,直接r[i]=i<p?min(p-i+1,r[2*a-i]):1,然后往两边扩展就行了
模板题:HDU3068
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=2e6+;
int n;
char s[N],a[N];
int r[N];
void Manacher(char s[],int n){
int p=,a,ans=;
for(int i=;i<=n;i++){
r[i]=i<p?min(p-i+,r[*a-i]):;
while(s[i-r[i]]==s[i+r[i]]) r[i]++;
if(i+r[i]->p) p=i+r[i]-,a=i;
ans=max(ans,r[i]);
}
printf("%d\n",ans-);
//for(int i=1;i<=n;i++) printf("%d ",r[i]);puts("\n");
}
void iniStr(char s[]){
for(int i=;i<=n;i++)
a[(i<<)-]='#',a[i<<]=s[i];
a[(n<<)+]='#';
a[]='@';a[(n<<)+]='$';
}
int main(){
freopen("in","r",stdin);
while(scanf("%s",s+)!=EOF){
n=strlen(s+);
iniStr(s);
Manacher(a,n<<1|1);
}
}
[Manacher]【学习笔记】的更多相关文章
- Manacher学习笔记
目录 code(伪) Manacher算法 可在 \(O(n)\)的时间内求出一个字符串以每个位置为中心的最长回文子串. 原理:根据之前预处理出的回文串长度求得新的回文串长度 我们可以通过在字符中加上 ...
- Manacher 学习笔记
\(\\\) \(Manacher\) 一种常用的字符串算法,用于处理一些回文字符相关的问题. 回文串:从前向后和从后向前输出一致. 回文中心:以这里开始,每次向外左右各扩展一个字符得到的回文串的中心 ...
- Manacher算法学习笔记 | LeetCode#5
Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...
- 学习笔记 - Manacher算法
Manacher算法 - 学习笔记 是从最近Codeforces的一场比赛了解到这个算法的~ 非常新奇,毕竟是第一次听说 \(O(n)\) 的回文串算法 我在 vjudge 上开了一个[练习],有兴趣 ...
- 【学习笔记】字符串—马拉车(Manacher)
[学习笔记]字符串-马拉车(Manacher) 一:[前言] 马拉车用于求解连续回文子串问题,效率极高. 其核心思想与 \(kmp\) 类似:继承. --引自 \(yyx\) 学姐 二:[算法原理] ...
- OI知识点|NOIP考点|省选考点|教程与学习笔记合集
点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
随机推荐
- linux系统下,警告:warning: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration] 和 warning: the `gets' function is dangerous and should not be used. 的由来和解决方法。
字符数组 的英文名字是 char [] gets()函数的基本用法为:char *gets(char *s); 该函数的参数是一个字符数组,该函数的返回值也是一个字符数组. linux下的代码如下: ...
- angular2 Http和websocket
1. 注入HttpModule模块: 2. 注入http服务 map方法需要导入"rajx/Rx"组件,作用是针对流的处理.Json是将流转化为json格式.subscribe订阅 ...
- input框type=file设置cursor:pointer的问题
为了让美化上传文件框,设置了cursor:pointer;,然而不起作用,然后百度找到了解决方法,设置font-size:0,这样就可以了.
- React Native学习(六)—— 轮播图
本文基于React Native 0.52 Demo上传到Git了,有需要可以看看,写了新内容会上传的.Git地址 https://github.com/gingerJY/React-Native-D ...
- java中static关键字的继承问题
结论:java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 原因: 1). 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制及可以调用 ...
- SSL证书绑定成功
LNMPA一键安装包:装好后, 静态文件用nginx服务器,php文件用Apache服务器, 默认Apache端口为88:nginx为80: SSL证书装之前80端口, 装好后用443端口:
- vue.js打包后,接口安全问题
后面有一位朋友回答后台origin判断,但另一个朋友说可以通过代理请求就绕过跨域. 想想也对,代理的话origin就无效了,页面还是可以跑起来. 不知道有没有人想过这个问题,还是我想的方向有误,请各位 ...
- nginx https配置后无法访问,可能防火墙在捣鬼
同事发现nginx配置后https 无法访问,我帮忙解决的时候从以下出发点 1.防火墙未开放443端口 2.配置出错 1 2 3 于是就 netstat -anp 查看防火墙开的端口 发现已经在监听了 ...
- LNMP一键安装包
http://www.aliweihu.com/333.html LNMP一键安装包是什么? LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RadHat.Debian/Ub ...
- css3图片动画旋转
body{ background-color:#021E36; text-align: center; } .container{margin:500px auto;} .round{position ...