# a # b # b # a #

当我们遇到回判断最长回文字符串问题的时候,若果用暴力的方法来做,就是在字符串中间添加 #,然后遍历每一个字符,找到最长的回文字符串。那么马拉车算法就是在这个基础上进行了改进,我觉得和KMP有点像。

当我们遍历第一个字符串的时候,肯定有一个回文串半径。

设一变量mx为半径达到最右边的下标,id为mx的中心,len为最长半径的长度。

如图所示,i关于id存在对称点2id - i,由于左右关于id对称,所以我们要求i的当前最长回文半径,如果i<mx时候, 以2 * id - i为参考即可,如果pal [ 2 * id-i]小于mx-i,那么pal [ i ]初始化为pal [ 2 * id-i],否则初始化为mx-i。如果,i>=mx那么pal [ i ]初始化为1 暴力判断吧。

看代码:

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<string.h>
  4. using namespace std;
  5. char s[110010],a[110010*2];
  6. int len,mx,id,pal[110010*2];
  7. void manacher()
  8. {
  9. int j=0;
  10. a[j++]='#';
  11. for(int i=0;s[i]!='\0';i++)
  12. {
  13. a[j++]=s[i];
  14. a[j++]='#';
  15. }
  16. a[j]='\0';
  17. for(int i=1;a[i]!='\0';i++)
  18. {
  19. pal[i]=mx>i?min(pal[2*id-i],mx-i):1;//pal[i] 以 i 为半径
  20. while(a[i+pal[i]]==a[i-pal[i]]&&i-pal[i]>=0&&a[i+pal[i]]!='\0')//防越界
  21. {
  22. pal[i]++;//半径向两边扩展
  23. }
  24. if(mx<i+pal[i])//更新最右边的值
  25. {
  26. id=i;
  27. mx=i+pal[i];
  28. }
  29. if(len<pal[i]-1)//最长长度
  30. len=pal[i]-1;
  31. }
  32. printf("%d\n",len);//因为一开始加了‘#’
  33. }
  34. int main()
  35. {
  36. while(~scanf("%s",&s))
  37. {
  38. memset(pal,0,sizeof(pal));
  39. len=0,mx=0,id=0;
  40. manacher();
  41. }
  42. return 0;
  43. }

HDU - 3068 最长回文manacher马拉车算法的更多相关文章

  1. hdu 3068 最长回文 manacher算法(视频)

    感悟: 首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接:戳戳戳 感觉这种花费自己时间去教别人的人真的很伟大. manacher算法把所有的回文都变 ...

  2. hdu 3068 最长回文 manacher

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正 ...

  3. hdu 3068 最长回文(manacher&amp;最长回文子串)

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. hdu 3068 最长回文(manacher入门)

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. HDU 3068 最长回文 manacher 算法,基本上是O(n)复杂度

    下面有别人的比较详细的解题报告: http://wenku.baidu.com/view/3031d2d3360cba1aa811da42.html 下面贴我的代码,注释在代码中: #include ...

  6. HDU 3068 最长回文(manachar算法)

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. HDU - 3068 最长回文(马拉车Manacher)题解

    思路:马拉车裸题,我们用一个p[i]数组代表以i为中心的最大回文半径.这里用了一个小技巧,如果一个串是aaaa这样的,那我们插入不相干的字符使它成为#a#a#a#a#,这样无论这个串是奇数还是偶数都会 ...

  8. hdu 3068 最长回文子串 马拉车模板

    前几天用后缀数组写过一次这题,毫无疑问很感人的TLE了-_-|| 今天偶然发现了马拉车模板,O(N)时间就搞定 reference:http://acm.uestc.edu.cn/bbs/read.p ...

  9. HDU 3068 最长回文 Manacher算法

    Manacher算法是个解决Palindrome问题的O(n)算法,能够说是个超级算法了,秒杀其它一切Palindrome解决方式,包含复杂的后缀数组. 网上非常多解释,最好的解析文章当然是Leetc ...

随机推荐

  1. 带你封装自己的MVP+Retrofit+RxJava2框架(一)

    前言 文本已经收录到我的Github个人博客,欢迎大佬们光临寒舍:我的GIthub博客 看完本篇文章的,可以看下带你封装自己的MVP+Retrofit+RxJava2框架(二),里面封装得到了改进 本 ...

  2. 并查集(不相交集)的Remove操作

    给并查集(不相交集)的添加一个\(Remove(X)\)操作,该操作把\(X\)从当前的集合中除去并把它放到自己的集合中. 实现思想 英文原句 We assume that the tree is i ...

  3. [面试专题]Web缓存详解

    Web缓存详解 标签(空格分隔): 缓存 缓存之于性能优化 请求更快:通过将内容缓存在本地浏览器或距离最近的缓存服务器(如CDN),在不影响网站交互的前提下可以大大加快网站加载速度. 降低服务器压力: ...

  4. 【译文连载】 理解Istio服务网格(第六章 可观测性)

    全书目录 第一章 概述 第二章 安装 第三章 流控 第四章 服务弹性 第五章 混沌测试 ​本文目录 第6章 可观测性 6.1 分布式调用链跟踪(tracing) 6.1.1 基本概念 6.1.2 Ja ...

  5. a++与++a的陷阱与盲区

    故事发生在2019.7.15的3.pm,正在复习数据结构题目,写了一句如下指令(以下函数运行在win10的dev编译器下面) #include<bits/stdc++.h> using n ...

  6. 峰哥说技术:01-Spring Boot介绍

    Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 Spring Boot介绍 A.Spring Boot是什么? 由于Spring是一个轻量级的企业开发框架 ...

  7. racket学习-call/cc (let/cc)

    Drracket continuation 文中使用let/cc代替call/cc Racket文档中,let/cc说明为: (let/cc k body ...+) Equivalent to (c ...

  8. JS高精度乘法计算问题(牛客网乘法-求 a 和 b 相乘的值,a 和 b 可能是小数,需要注意结果的精度问题)

    用到的知识点===> toFixed(num); toFixed() 方法可把 Number 四舍五入为指定小数位数的数字; 参数num: 代表小数位数: 例:var num = 5.56789 ...

  9. Python 小技巧:如何实现操作系统兼容性打包?

    有一个这样的问题:现要用 setuptools 把一个项目打包成 whl 文件,然后 pip install 在 Windows/Linux 两种操作系统上,但是该项目中有一些依赖库只有 Window ...

  10. mysql 如果没有密码 就不能远程连接

    mysql 如果没有密码 就不能远程连接