因为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/马拉车常用用法一览的更多相关文章

  1. linux的vi编辑器常用用法一览

    vi 命令用于编辑文本文件,语法: vi 文件名 vi 是一个比较强大的编辑工具,类似于windows下的notepad,但是功能要强大的多.vi分为三种模式,分别是“一般模式”,“编辑模式”,“命令 ...

  2. centos的vi常用用法

    centos的vi常用用法 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的 ...

  3. MySql与SqlServer的一些常用用法的差别

    MySql与SqlServer的一些常用用法的差别 本文为转载 本文将主要列出MySql与SqlServer不同的地方,且以常用的存储过程的相关内容为主. 1. 标识符限定符 SqlServer [] ...

  4. [转]ssh常用用法小结

    ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...

  5. 【三支火把】---一份程序看懂C程序printf()的几种常用用法

    闲来继续巩固我的学习之路,今天略微整理了一下,C程序中Printf()的一些常用用法,虽然自己以前好像会,但是不够系统,今天大致整理了一些,先贴上来看看,以后在看到其他,继续补充,希望能帮到一些像我一 ...

  6. grep参数说明及常用用法

    grep参数说明及常用用法 趁着午休的时间把自己经常使用的一些grep命令整理一下. 方便以后查看. 后续会逐步把awk/sed/find等常用的命令理一理. 增强下记忆. 也算是对得起自己了. ^^ ...

  7. ssh常用用法小结

    ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...

  8. C# Linq基本常用用法

    1.什么是Linq? Lanaguage Interated Query(语言集成查询),Linq 是集成C# 和VB这些语言中用于提供数据查询能力的一个新特性. 这里只介绍两种基本常用用法. 学习方 ...

  9. Java集合中迭代器的常用用法

    该例子展示了一个Java集合中迭代器的常用用法public class LinkedListTest { public static void main(String[] args) { List&l ...

随机推荐

  1. leetcode- 距离顺序排序矩阵单元格

    C++解法: #include <iostream> #include <vector> #include <map> #include <algorithm ...

  2. leetcood学习笔记-70-爬楼梯

    题目描述: 第一次提交:(超时) class Solution: def climbStairs(self, n: int) -> int: if n == 0 or n == 1 or n = ...

  3. php注册 及审核练习

    1.注册界面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  4. PHP ftp_site() 函数

    定义和用法 The ftp_site() 函数向 FTP 服务器发送 SITE 命令. SITE 命令没有标准化,在不同的服务器上不尽相同.对于处理文件权限或组关系方面的事情,SITE 命令很有用. ...

  5. NX二次开发-UFUN遍历图层UF_LAYER_cycle_by_layer

    NX11+VS2013 #include <uf.h> #include <uf_layer.h> #include <uf_ui.h> UF_initialize ...

  6. Spring声明式事务的实现方式选择(JDK动态代理与cglib)

    1.简介 Spring声明式事务的具体实现方式是动态决定的,与具体配置.以及事务代理对象是否实现接口等有关. 2.使用JDK动态代理的情况 在满足下面两个条件时,Spring会选择JDK动态代理作为声 ...

  7. 笨办法学Python记录--习题1-11

    20140412(习题1-10),和打印较劲: 1. 读这本书时没有按照要求安装Python2,我选择的是最新版3.4.0(官方release),然后悲剧发现完全不兼容,现在摘录2,3区别: 这个星期 ...

  8. 牛客多校第十场 H Stammering Chemists 判断图同构

    题意: 给出一个无向图,表示一种有机物质的结构式,问你这个有机物质是列表中的哪个. 题解: 判断图同构需要枚举全排列以对应点,但是此题中几乎只需要将点度数排序后一个一个比较,对于甲基位置再加个特判即可 ...

  9. 5.RabbitMQ 客户端控制消息

    1.生产者发送消息,消费者结束消息并回执 2.通过channel.basicConsume向服务器发送回执,删除服务上的消息 3.//不向服务器发送回执,服务器的消息一直存在 4.//消费者拒绝接受消 ...

  10. springboot 项目普通类中调用mapper或service接口

    1.该类使用@Component注解 2.添加一个本类类型的静态字段 3.创建一个初始化方法,贴上@PostConstruct 标签,用于注入bean 4.创建方法调用mapper或service接口 ...