关于manacher算法,似乎在学完KMP之后,比较容易上手,虽然有些原理方面,我没有理解的太深。

Manacher就是解决回文串的问题,求一个字符串中的最长回文子串。

Manacher算法首先对字符串进行处理:在所有字符之间插入‘#’,这样的好处是,无论最长回文子串是奇数个或者是偶数个,都可以进行处理。

处理过程是这样的

假设原串是这样的

1 2 3 4 5

a b b a d

处理完成一个新数组

0  1  2  3  4  5  6  7  8  9  10  11  12

? #  a #  b  #  b  #  a  #  d    #   0

1  2  1  2  5  2  1  2  1   2    1

首尾设置完全不相干的字符,是为了检测回文时,不会被算进去。

最下一列叫做P[i] ,用来记录当前位的回文个数,如果前后都不回文,默认p[i]=1,(可以当成自身回文)。

算法核心部分有三部分

还是直接用代码来讲吧:

HD#include <iostream>

#include <cstdio>
#include <cstring>
#define maxn 1100050
char str[maxn];
char a[maxn<<];
int p[maxn<<];
int min(int x,int y)
{
if (x<y) return x;
return y;
}
int main()
{while (scanf("%s",&str[]))
{ if (str[]=='E') break;
int i,j;
a[]='?',a[]='#';
for (i=; str[i]; i++)//处理成新的字符串。
{
a[(i<<)]=str[i];
a[(i<<)+]='#';
}
int n=(i<<);
a[n]=;
int maxid=,maxl=,id=;
for (i=; i<n; i++)//代码的核心部分。
{
if (maxid>i)//如果之前记录的最大回文覆盖超过了当前点坐标,进行比较(这一步其实我也不是很理解,只知道可以节省搜索,优化时间)
p[i]=min(p[*id-i],maxid-i); //进行覆盖度的比较,取较小的为p[i]
else
p[i]=; //否则直接定义为默认值1。
while (a[i+p[i]]==a[i-p[i]]) p[i]++; //前后搜索,若回文,则+1;
ifmaxid)//获取当前最大覆盖面,和覆盖点。
{
maxid=p[i]+i;
id=i;
}
if (p[i]>maxl) maxl=p[i]; //最大回文长度保存在p[i]中,取p[i]最大值即可。(此时最长回文串的中间点即为i点(不过是加了‘#’的新串))
}
printf("%d\n",maxl-);
}
return ;
}

Hdu_3068 Manacger算法的心得的更多相关文章

  1. 高频交易算法研发心得--RSI指标及应用

    高频交易算法研发心得--RSI指标及应用 前面文章中我们提到了MA均线(包括EMA,SMA).MACD以及SAR指标,这三类指标存在一个共同特点,即:从固定周期的价格作为判读的指导思想,并将价格进行平 ...

  2. 高频交易算法研发心得--WAVT指标(Warensoft交易量趋势指标)算法及应用

    高频交易算法研发心得--WAVT指标(Warensoft交易量趋势指标)算法及应用 注:WAVT指标由Warensoft(王宇)原创. 前面聊了一系列的常见应用指标,包括短线.长线的指标,并且也无耐的 ...

  3. 高频交易算法研发心得--MACD指标算法及应用

    凤鸾宝帐景非常,尽是泥金巧样妆. 曲曲远山飞翠色:翩翩舞袖映霞裳. 梨花带雨争娇艳:芍药笼烟骋媚妆. 但得妖娆能举动,取回长乐侍君王. [摘自<封神演义>纣王在女娲宫上香时题的诗] 一首定 ...

  4. AI大厂算法测试心得:人脸识别关键指标有哪些?

    仅仅在几年前,程序员要开发一款人脸识别应用,就必须精通算法的编写.但现在,随着成熟算法的对外开放,越来越多开发者只需专注于开发垂直行业的产品即可. 由调查机构发布的<中国AI产业地图研究> ...

  5. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  6. ACM失败之路

    校赛打完,已过四月,该是准备背起行囊,踏上考研之路了,自然,得先阔别一下ACM了,想起这几年ACM路,感慨颇多,不得不一诉心肠,与大家分享一下我的ACM历程,如果有人能从此文获取一些益处,那我就很欣慰 ...

  7. BM和KMP字符串匹配算法学习

    BM和KMP字符串匹配算法学习 分类: 研究与学习 字符串匹配BM(Boyer-Moore)算法学习心得 http://www.cnblogs.com/a180285/archive/2011/12/ ...

  8. 电梯V2.0

    电梯V2.0 GitHub仓库地址 Problem 一栋10层的大楼(楼层编号1-10),设3台无限载重的电梯,初始时电梯停在1层.其中:1号电梯只能停留在奇数层,2号电梯可以各层都停留,3号电梯只停 ...

  9. KMP算法心得

    今天又看了一遍KMP,感觉真的懂了...就来这儿发一下心得吧. KMP算法其实就是暴力的改进版.让我们看看暴力的匹配. Original string: ababababcbbababababc Pa ...

随机推荐

  1. spring core:@AliasFor的派生性

    spring对Annotation的派生性应用可谓炉火纯青,在spring core:@Component的派生性讲过支持层次上派生性,而属性上派生的需求则借助了@AliasFor,它是从spring ...

  2. 微信小程序实现左滑删除效果(原生/uni-app)

    实现效果 列表中侧滑删除 删除不同时存在 scrollview上下滑动与侧滑删除不影响 uni-app实现 html部分 <template> <scroll-view :scrol ...

  3. git上传流程

    转: 1.在github上创建项目 2.使用git clone https://github.com/xxxxxxx/xxxxx.git克隆到本地 3.编辑项目 4.git add . (将改动添加到 ...

  4. 【LeetCode】合并两个有序数组

    [问题] 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ...

  5. 150-PHP nl2br函数(一)

    <?php $str="h t m l"; //定义一个多处换行的字串 echo "未处理前的输出形式:<br />{$str}"; #nl2 ...

  6. request.getParameter() 接收参数中文乱码

    修改tomcat配置文件 设置url编码集 <Connector port="8080" protocol="HTTP/1.1" connectionTi ...

  7. 实验吧-杂项-你知道他是谁吗?(转盘密码、NTFS数据流检测及导出)

    刚看到的时候听懵,没注意到重点,其实很多时候题目中的细节就是给我们线索的,所以审题和思考是很重要的. 在没做到点上的是,也做了一点努力,没有效果,科普一下这个人((*^▽^*))图片上是托马斯.杰斐逊 ...

  8. Nginx php-fpm 分离搭建 (上) 未完

    最近又重新看了一遍   'nginx入门到精通'      抽点时间 出来搭几个Demo  会有更深体会: Nginx如何与Php-fpm结合 Nginx不只有处理http请求的功能,还能做反向代理. ...

  9. idea自定义快捷鍵

    一  生成方法注释 1. File -> Settings... 2. Editor -> Live Templates,点击最右边的+ 3. 依自己情况选择,我这里选择的 Live Te ...

  10. 在mac电脑的terminal里该如何运行c语言

    若要在 Mac 的终端中编译并运行 C 源代码,你首先需要安装 Command Line Tools,里面包含有 GCC 编译器.安装方法为: 打开终端,输入 gcc. 如果你没有安装 Command ...