mannachar(马拉车)究竟是什么东西呢?
很简单,就是能让你在O(n)的复杂度内求出一个串的最长回文子串。传统的算法复杂度是O(n^2),呐,为什么mannachar能变快呢?因为mannachar用到了算过的东西来进行优化。脑补一下,当你发现了一个回文串,那么是不是左右就对称了呢?然后左边的最长回文子串是已经求过了,所以右边对应的点的最长回文子串至少也有那么多。
先贴一波代码

#include<cstdio>
#include<cstring>
template <typename T>inline T max(const T x,const T y){return x>y?x:y;}
template <typename T>inline T min(const T x,const T y){return x<y?x:y;}
char s[11000001],t[22000010];
int p[22000002],len,l;
int main()
{scanf("%s",s+1),len=strlen(s+1);t[l++]='$',t[l++]='#';for(register int i=1;i<=len;i++)t[l++]=s[i],t[l++]='#';int maxx=0,num=0,res=0;for(register int i=0;i<l;i++){p[i]=maxx>i?min(p[(num<<1)-i],maxx-i):1;while(t[i+p[i]]==t[i-p[i]])p[i]++;if(i+p[i]>maxx){maxx=i+p[i];num=i;}res=max(res,p[i]);}printf("%d",res-1); return 0;
}

它的复杂度是O(n)的,为什么呢?请看我的代码中的maxx这个变量表示现在最长回文子串的右边界的最远值,最多移动n次,复杂度就证好啦
其实mannachar并不难,不过说实话用的场合不是很多,所以嘛,学一下,掌握一下就好啦,再去学字符串的其它算法组合一下就能做出一些题啦

mannachar(马拉车)求最长回文子串相关推荐

  1. Manacher马拉车算法求最长回文子串

    终于把马拉车算法搞明白了!赶紧记录一下. 这个算法用于查找一个字符串的最长回文子串 马拉车算法依次给数组p[i]赋值,马拉车算法的本质就是在每次给数组p[i] 赋值时尝试进行偷懒 例如,当要给p[6] ...

  2. 马拉车算法(manacher)求最长回文子串

    关于回文字符串的概念大家可以大致去搜索一下,这里不赘述. 一.解题思路 当前字符串 最长回文子串: 思路实际上很简单,就是遍历每一个元素,然后分别以这个元素为中心,向两边扩展,比如说现在i = 4,那 ...

  3. Manacher 求最长回文子串算法

    Manacher算法,是由一个叫Manacher的人在1975年发明的,可以在$O(n)$的时间复杂度里求出一个字符串中的最长回文子串. 例如这两个回文串"level"." ...

  4. python求回文_python实现求最长回文子串长度

    给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最长回文子串是'3553',所以返回4. 最容易想到的办法是枚举出所有的子串,然后一一判断是否为回文串,返回最长的回文子 ...

  5. 字符串处理 —— 回文串相关 —— 求最长回文子串

    [暴力枚举] 求最长回文串最容易的方法就是暴力枚举,求出字符串的每一个子串,然后判断是不是回文,找到最长的那个回文串 求每一个子串的时间复杂度为 O(N^2),判断一个子串是不是回文时间复杂度为 O( ...

  6. 马拉车java_leetcode-5 最长回文子串-画蛇添足的马拉车算法

    leetcode-5 最长回文子串 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: &q ...

  7. 【HDU - 3068】最长回文(Manacher算法,马拉车算法求最长回文子串)

    题干: 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.  回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case,不超过120组 ...

  8. (力扣)中心扩散法求最长回文子串

    Question: 给定一个字符串,输出其中最长的回文子串. 几种解法: 暴力枚举:时间复杂度:O(n3)(略) (双层枚举:O(n2)判断是否为回文串:O(n)) 动态规划:时间复杂度O(n2),空 ...

  9. 求最长回文子串——C++ (动态规划+暴力解法)

    声明:本文原题主要来自力扣,记录此博客主要是为自己学习总结,不做任何商业等活动! 一.题目描述 给你一个字符串 s,找到 s 中最长的回文子串. 示例 1: 输入:s = "babad&qu ...

最新文章

  1. Java Socket 客户端使用指定端口多次连接服务器引发 BindException
  2. Restlet Client 安装 网盘里面有压缩文件夹下载引用即可 谷歌浏览器
  3. pytorch中深度拷贝_pytorch:对比clone、detach以及copy_等张量复制操作
  4. 查看Linux内核版本、系统版本命令
  5. REST与RESTful
  6. kafka消费者分区的分配的三种机制
  7. windows server 2003 AD之FSMO角色
  8. vba 服务器上删除文件夹,Excel vba 如何操作文件夹的创建以及删除
  9. 在哪里学python-在合肥学习Python去哪
  10. 【操作系统】Mac环境配置
  11. 如何安装python3.6_python3.6环境下如何安装freetype库和基本使用方法
  12. 用protobuf进行C#与Java通信
  13. spss相关分析(spss统计分析实验教程,谢蕾蕾)
  14. 如何写出一篇好的软文?软文撰写的一些注意事项!
  15. 计算机科学家手抄报图片,关于简洁又漂亮的科学手抄报图片
  16. python逻辑量是什么意思_python 逻辑术语
  17. 笔记本显示dns服务器,笔记本电脑显示无线网DNS设置错误该怎么解决
  18. Linux 将普通用户改成root用户
  19. MosMedData: 新冠肺炎胸部 CT扫描数据集上基于3D-CNN实现二分类
  20. LeetCode 1155. 掷骰子的N种方法 每日一题

热门文章

  1. 负责域名解析的DNS服务
  2. 大数据神器Kafka入门
  3. 什么是声明式事务控制
  4. 缓存redis的实现思路
  5. 消息队列入门案例-编码
  6. 由若干计算机网络连接而成的网络,计算机网络复习大纲(中山大学)
  7. Spring Security源码解析(三)—— HttpSecurity
  8. Spring--IoC(2)
  9. c语言如何获取按键,c语言获得键盘的按键
  10. 字符之间或者结构体之间比较