Manacher

作者: WJNominate | 来源:发表于2017-04-22 00:35 被阅读0次

[hdu 3068|http://acm.hdu.edu.cn/showproblem.php?pid=3068]

const int MaxN = 1000000 + 7;
char ms[MaxN * 2];
int mr[MaxN * 2];
int manacher( char *s ) {
  int len = strlen( s ), l = 0;
  ms[l++] = '$';
  for( int i = 0; i < len; ++i, l += 2 ) {
    ms[l] = '#', ms[l + 1] = s[i];
  }
  ms[l++] = '#';

  int mx = 0, mp = 0, ans = 0;
  for( int i = 0; i < l; ++i ) {
    mr[i] = mx > i ? min( mr[mp * 2 - i], mx - i ) : 1;
    while( ms[i + mr[i]] == ms[i - mr[i]] )  mr[i]++;
    if( i + mr[i] > mx ) {
      mx = i + mr[i], mp = i;
    }
    ans = max( ans, mr[i] - 1 );
  }

  return ans;
}
  • Note

    1. 填充首末间隙,并且首部再加一个(使整个串S是回文串时失配)\

  mr[i] = mx > i ? min( mr[mp * 2 - i], mx - i ) : 1;
  while( ms[i + mr[i]] == ms[i - mr[i]] )  mr[i]++;
  if( i + mr[i] > mx ) mx = i + mr[i], mp = i;
  1. 类似尺取,S_i 只进一次 => O(n)

相关文章

  • 寻找字符串中的最长回文子串Manacher's Algo

    Manacher's Algorithm 马拉车算法

  • Manacher算法(马拉车算法)

    Manacher算法(马拉车算法) Manacher算法,又叫“马拉车”算法,可以在时间复杂度为O(n)的情况下求...

  • KMP && manacher

    kmp exkmp: manacher KMP自动机

  • Manacher

    [hdu 3068|http://acm.hdu.edu.cn/showproblem.php?pid=3068]...

  • 马拉车算法(Manacher's Algorithm)

    Manacher's Algorithm,中文名叫马拉车算法,是一位名叫Manacher的人在1975年提出的一种...

  • 最长回文子串

    最长回文子串 public class Manacher { public static int min(int ...

  • manacher算法

    概念:求字符串的最大回文串1.先处理成偶数串2.回文半径3.回文半径最右边界,并记录最早中心位置 扩展题 给定一个...

  • Manacher算法

    最长回文子串问题# 给定一个字符串,找出最长的回文子串,如"waabwswbfd",则最长子串为bwsb. 中心试...

  • Manacher算法

    前言 Manacher算法用于求解字符串中最长的回文子串,它和KMP算法的改进方式很类似,都是基于暴力求解的方法,...

  • Manacher算法

    看这样一道例题: hdoj-3068.最长回文 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S...

网友评论

      本文标题:Manacher

      本文链接:https://www.haomeiwen.com/subject/ylijzttx.html