首页 > 其他分享 >manacher

manacher

时间:2024-02-08 23:11:25浏览次数:23  
标签:int manacher 算法 回文 d2 d1

记录
23:39 2024-2-5

manacher算法,是可以在O(n)时间计算回文串的算法

具体思路可以查看Manacher

非常有意思的算法。利用了俩个数组d1[i] 和 d2[i] 分别来记录以位置 i 为中心的长度为奇数和长度为偶数的回文串个数
这里利用了回文串个数也即以i为中心的最长回文串的半径长度 (半径长度指的是 i -> r)

同时利用l,r不断记录r最大的回文串,r越大,对于i来说越容易利用到前面获得的信息
就是利用 i 和 l + r - i 这俩个在[l,r]中对称的位置,感觉听说过的字符串算法不少都是利用前面的信息
(KMP、ac自动机还有刚看到的Z函数(扩展KMP),好像是废话 -,-)
(我还想需不需要考虑l的位置,但其实选择了最大的r后,l就必须选这个了)

代码也来自 OIwiki

点击查看代码
// 计算d1[i] 奇字符串
vector<int> d1(n);
for (int i = 0, l = 0, r = -1; i < n; i++) {
  int k = (i > r) ? 1 : min(d1[l + r - i], r - i + 1);
  while (0 <= i - k && i + k < n && s[i - k] == s[i + k]) {
    k++;
  }
  d1[i] = k--;
  if (i + k > r) {
    l = i - k;
    r = i + k;
  }
}

// 计算d2[i] 偶字符串
vector<int> d2(n);
for (int i = 0, l = 0, r = -1; i < n; i++) {
  int k = (i > r) ? 0 : min(d2[l + r - i + 1], r - i + 1);
  while (0 <= i - k - 1 && i + k < n && s[i - k - 1] == s[i + k]) {
    k++;
  }
  d2[i] = k--;
  if (i + k > r) {
    l = i - k - 1;
    r = i + k;
  }
}

// 统一处理

题目记录

leetcode--5. 最长回文子串

标签:int,manacher,算法,回文,d2,d1
From: https://www.cnblogs.com/57one/p/18009024

相关文章

  • manacher 学习笔记
    定义与基本求法定义又名马拉车,用于处理子串回文问题。基本求法暴力判断每个子串是否是回文是\(O(n^3)\)的,根据其对称性优化为\(O(n^2)\)依旧是不优秀的。马拉车便是解决这种单一问题的算法,具有局限性,但同时是解决这种问题的不二选择。枚举回文串的中点,例如\(aaba......
  • 最小表示法&Manacher学习笔记+杂题
    字符串系列前言:孩子从小就自卑。四、最小表示法&Manacher学习笔记+杂题相关题单:戳我1.最小表示法最小表示法是用于解决字符串最小表示问题的方法。(1)字符串的最小表示:字符串\(s\)的最小表示为与\(s\)循环同构的所有字符串中字典序最小的字符串。循环同构指的是当字符......
  • 最小表示法&Manacher学习笔记+杂题
    字符串系列前言:孩子从小就自卑。四、最小表示法&Manacher学习笔记+杂题相关题单:戳我1.最小表示法最小表示法是用于解决字符串最小表示问题的方法。(1)字符串的最小表示:字符串\(s\)的最小表示为与\(s\)循环同构的所有字符串中字典序最小的字符串。循环同构指的是当字符......
  • 【学习笔记】manacher
    众所周知,manacher又叫“马拉车”算法,是一种线性求解最长回文子串的算法。推荐结合模板阅读此文。求最长回文子串,首先想到的是暴力。枚举子串的左右端点\(l,r\),再判断这个子串是否回文。总复杂度\(O(n^3)\),效率过低。观察发现,我们可以只枚举中点,然后同时向左右不断扩展,当无......
  • 高铁拉我,马拉车——记高铁路上的manacher
    目录前言问题引入思路一览manacher高效的原因具体情况讨论小问题的讨论code前言不得为什么,总会在奇奇怪怪的时候特定时间看算法比平常看得舒服多了,之前看字符串匹配的时候自然是准备把马拉车一起看了的,但是那时候看不下去,昨天回家的高铁上再次看了看,觉得格外的亲切,emmm问题引入......
  • 【CF30E】Tricky and Clever Password 题解(manacher + exKMP)
    manacher+exKMP+二分。感觉是最粗暴的方法,想出来之后自己硬莽了4k,荣获题解区最长。Solution约定:下文所提及到的所有的回文串,均指奇长度回文串。显然把题目拆成两个部分,中间的回文串,以及两边相同的连续子串。考虑一下从哪个入手比较好。忘记是咋想的了,易得从两边相同......
  • Manacher与exKMP(扩展KMP,Z函数)
    Manacher算法该算法由GlennK.Manacher在1975年提出,首先注意到回文串的对称中心特性可能有所不同(中心可能为一个字符或者是在两个字符之间),那么我们将字母之间插入隔板,这两个回文串的对称中心就都在一个字符上了,suchas"|A|B|B|A|"、"|A|B|C|B|A|"过程对于一个回文串,有且......
  • KMP算法和Manacher算法
    KMP算法KMP算法解决的问题KMP算法用来解决字符串匹配问题:找到长串中短串出现的位置.KMP算法思路暴力比较与KMP的区别暴力匹配:对长串的每个位,都从头开始匹配短串的所有位.KMP算法:将短字符串前后相同的部分存储在\(next\)数组里,让之前匹配过的信息指导之后的匹配.......
  • manacher
    \(\mathrm{manacher}\)算法可以在线性时间内求出一个串中的最长回文子串。为了解决偶回文串的中心点非整数,在每个字符之间添加一个字符#。为防止越界问题再在串的前后加上奇怪的符号。记\(mx\)为当前最长回文串的右端,\(id\)为串中心的位置,\(len_{id}\)为以\(id\)为中心......
  • 洛谷P3805 【模板】manacher
    题目链接:https://www.luogu.com.cn/problem/P3805manacher算法模板题。参考资料:https://oi-wiki.org/string/manacher/示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=2.2e7+5;intn;chars[maxn/2],a[maxn];intp[maxn];voidinit(){......