因为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. 2019-9-11-.NET-Standard

    title author date CreateTime categories .NET Standard lindexi 2019-9-11 9:0:29 +0800 2019-9-11 9:0:2 ...

  2. 代码托管平台--GitHub 使用小结

    一.GitHub介绍 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git作为唯一的版本库格式进行托管.在GitHub,用户可以十分轻易地找到海量的开源代码. 很多IT行业的人到求职的 ...

  3. boost asio tcp 多线程

    common/pools.h // common/pools.h #pragma once #include <string> #include <boost/pool/pool.h ...

  4. Visio2016专业版永久激活码

    Visio2016专业版永久激活码: [Key]:NKVJM-8MTT4-8YDFR-6738M-DPFJH [Key]:W9WC2-JN9W2-H4CBV-24QR7-M4HB8 [Key]:7K8 ...

  5. MyBatis中大于和小于号的转义写法

    mybatis 中 SQL 写在mapper.xml文件中,而xml解析 < .>.<=.>= 时会出错,这时应该使用转义写法. 方式一 < <= > > ...

  6. 2 java程序入门

    1. 第一个java  class  { public static void main(String[] args) { System.out.println("Hello World!& ...

  7. 关于scroll、client、offset和style中的height、width、top以及bottom属性

    内容和图片来自offset.scroll.client三大家族, 此处仅作记录使用 client offset scroll

  8. 七牛云-C#SDK-上传-简单上传

    请看系列C#-SDK-操作系列 https://i.cnblogs.com/posts?categoryid=1468598 接下来给大家分享的C#-SDK 简单上传 核心代码:有需要直接看这个,其实 ...

  9. leetcood学习笔记-167-两数之和 II - 输入有序数组

    题目描述: 第一次提交: class Solution(object): def twoSum(self, numbers, target): """ :type num ...

  10. python代码自动补全

    牛逼了!Python代码补全利器,提高效率告别996! Python之禅 Python之禅 微信号 VTtalk 功能介绍 人生苦短,我用Python,这里是一名老程序员分享Python技术的地方,欢 ...