manacher/马拉车常用用法一览
因为manacher算法把原来的字符串扩大了两倍,因此在应用时许多二级结论都非常不直观,现场推出来很麻烦,因此笔者在此做个简单整理,如果发现有错误或者有常用的我没有涉及到的,恳请在下方评论区指出,我会非常感谢。
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 200005
using namespace std;
char str[MAXN];
char ex[MAXN*];
int rad[MAXN*];
void make_char(const char *str,char *ex){
int l=strlen(str);
int i,j;
j=;
ex[]='$';
for(i=;i<l;i++){
ex[++j]='#';
ex[++j]=str[i];
}
ex[++j]='#';
ex[++j]='\0';
}
int manacher(const char *ex,int *rad){
int l1=strlen(ex);
int mx=,id=,i=;
int maxx=;
rad[]=;
for(i=;i<l1;i++){
if(i>=mx)rad[i]=;
else rad[i]=min(mx-i+,rad[*id-i]);
while(ex[i-rad[i]]==ex[i+rad[i]]){
rad[i]++;
}
if(i+rad[i]->mx){
id=i;
mx=i+rad[i]-;
}
maxx=max(maxx,rad[i]-);
}
return maxx;
}
int main(){
scanf("%s",str);
make_char(str,ex);
printf("%d\n",manacher(ex,rad));
return ;
}

1,rad数组虽然指的是回文半径,但是它的值减一和回文子串长度对应
因此,最长回文子串长度是
max(ans[i]-1)
2,怎么对应呢,引入一个“某位置在ex上对应位置”概念
str[i]对应于ex[2i+2]
str[l,r]对应于ex[2*l+2,2*r+2]
ex[l+r+2]是该子串在ex上的中点
要问str上的子串[l,r]是不是回文子串
只需判断rad[l+r+2]-1>=r-l+1即可
3,假设t是str上某个点,t为整数时此点为某个字符,t不是整数时夹在两个字符串中间
那么以t为中点的最长回文子串的长度是rad[ans[2t+2]]-1
令tmp=rad[ans[2t+2]]-2
对应到str上的字符串是str[t-(tmp/2),t+(tmp)/2)
4,子串的回文子串
对于子串str[l,r]
将ans[2l+1,2r+3]如此构造:
ans'[i]=min(ans[i],l-i+1,r-i+1)
配合数据结构食用更佳
manacher/马拉车常用用法一览的更多相关文章
- linux的vi编辑器常用用法一览
vi 命令用于编辑文本文件,语法: vi 文件名 vi 是一个比较强大的编辑工具,类似于windows下的notepad,但是功能要强大的多.vi分为三种模式,分别是“一般模式”,“编辑模式”,“命令 ...
- centos的vi常用用法
centos的vi常用用法 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的 ...
- MySql与SqlServer的一些常用用法的差别
MySql与SqlServer的一些常用用法的差别 本文为转载 本文将主要列出MySql与SqlServer不同的地方,且以常用的存储过程的相关内容为主. 1. 标识符限定符 SqlServer [] ...
- [转]ssh常用用法小结
ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...
- 【三支火把】---一份程序看懂C程序printf()的几种常用用法
闲来继续巩固我的学习之路,今天略微整理了一下,C程序中Printf()的一些常用用法,虽然自己以前好像会,但是不够系统,今天大致整理了一些,先贴上来看看,以后在看到其他,继续补充,希望能帮到一些像我一 ...
- grep参数说明及常用用法
grep参数说明及常用用法 趁着午休的时间把自己经常使用的一些grep命令整理一下. 方便以后查看. 后续会逐步把awk/sed/find等常用的命令理一理. 增强下记忆. 也算是对得起自己了. ^^ ...
- ssh常用用法小结
ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...
- C# Linq基本常用用法
1.什么是Linq? Lanaguage Interated Query(语言集成查询),Linq 是集成C# 和VB这些语言中用于提供数据查询能力的一个新特性. 这里只介绍两种基本常用用法. 学习方 ...
- Java集合中迭代器的常用用法
该例子展示了一个Java集合中迭代器的常用用法public class LinkedListTest { public static void main(String[] args) { List&l ...
随机推荐
- 读书笔记---《Docker 技术入门与实践》---为镜像添加SSH服务
之前说到可以通过attach和exec两个命令登陆容器,但是如果遇到需要远程通过ssh登陆容器的场景,就需要手动添加ssh服务. 下面介绍两种方法创建带有ssh服务的镜像,commit命令创建和通过D ...
- 关于使用AWS的centos
AWS的centos在版本上有些许不同. 当使用6代的时候,默认的登录用户是root 使用7代的系统,默认的登录用户是centos 否则登录不上去
- Vue-cli开发笔记三----------引入外部插件
(一)绝对路径直接引入: (1)主入口页面index.html中头部script标签引入: <script type="text/javascript" src=" ...
- MYSQL查询第二高的薪水
编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+| Id | Salary |+----+--------+| 1 | 100 || ...
- echats问题
echats 横轴显示不下datazoom配置,加入滚动条 实例博客 https://blog.csdn.net/Zheng_xiao_xin/article/details/80882113 常用 ...
- vue之vue-router嵌套路由
1.定义路由 routes: [ { path: '/product', //第一层路由 name: 'product', component: Vproductcontent,//父组件渲染的是子组 ...
- CodeForces祝贺上紫
还是靠手速了. 不少比赛,经常差几分钟/一个细节就能AC一道比较难的题目. 加油! P.S 只能当成休闲性质,不能再当成正业了.迈向科研...
- MyBatis是如何使用的?
MyBatis前身世iBatis本是Apache的一个开源项目,2010年这个项目迁移到google code并改名为MyBatis. 一.高级软件介绍 1.JDK 8 2.Eclipse mars2 ...
- 导出Excel(终极版)
/** * 导出excel 案例 */ public void exportExcel(){ long beginTime = System.currentTimeMillis(); HttpServ ...
- 【归档】Mysql大表归档
作为一个企业或者DBA,我们通常会有这种想法,数据是一个公司的核心命脉,应该需要永久保存,很多时候DBA和开发沟通的时候,开发人员也会这么告诉我们,这份数据非常重要,数据需要永久保存.然而,如果将数据 ...