Manacher算法是求回文串最高效的算法,能在线性时间内求出以每一个字符为中心的最长回文串。

 
首先,我们都能想出$O(N^2)$求出每一个字符为中心的最长回文串的算法。那么我们考虑这样一种情况。
如果一个回文串内包含了回文串。那么是否可以减少重复的计算。
比如
abaaba  这个字符串,要求他的最长回文串,首先我们应区分开奇数串和偶数串,考虑给每个字符中间加上一个之前从来没有出现过的字符,通常采用‘#’。
那么上面那个字符串就变成了
#a#b#a#a#b#a#
 
这时候就免除了对奇数串还是偶数串的分类讨论。即所有的回文串都是奇数串。
再思考这样一个情况,如果我们已经求出了第六个字符的最长回文串和第三个字符的最长回文串,那么第9个字符串的最长回文串长度显然等于第三个字符的最长回文串长度。即如果一个字符串是回文的,那么这个字符串倒转过来显然仍然是回文串。这就使Manacher算法变得很高效。
 
代码实现:
 
namespace solution{
      void manacher(){
            if(!((s[0]>='a'&&s[0]<='z')||(s[0]>='A'&&s[0]<='Z')))exit(0);
            LEN=strlen(s);
            t[0]='!';
            up(i,1,LEN*2){
                  t[i]='#';
                  t[i+1]=s[i/2];
                  i++;
            }
            t[2*LEN+1]='#';
            t[2*LEN+2]='$';
            LEN=2*LEN+1;
            rightt=ans=pos=0;
            up(i,1,LEN){
                  if(rightt>i)len[i]=min(rightt-i,len[2*pos-i]);
                  else        len[i]=1;
                  while(t[i-len[i]]==t[i+len[i]])len[i]++;
                  if(len[i]+i>rightt){
                        rightt=len[i]+i;
                        pos=i;
                  }
                  ans=max(ans,len[i]);
            }
            printf("%d\n",ans-1);
      }
}

首先把字符串转变,同时在最后一个字符处加上不同于所有字符的字符,防止越界。然后下面就是manacher算法的流程。不再多说。

Manacher算法的更多相关文章

  1. HDU3068 回文串 Manacher算法

    好久没有刷题了,虽然参加过ACM,但是始终没有融会贯通,没有学个彻底.我干啥都是半吊子,一瓶子不满半瓶子晃荡. 就连简单的Manacher算法我也没有刷过,常常为岁月蹉跎而感到后悔. 问题描述 给定一 ...

  2. manacher算法专题

    一.模板 算法解析:http://www.felix021.com/blog/read.php?2040 *主要用来解决一个字符串中最长回文串的长度,在O(n)时间内,线性复杂度下,求出以每个字符串为 ...

  3. lintcode最长回文子串(Manacher算法)

    题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...

  4. 1089 最长回文子串 V2(Manacher算法)

    1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa ...

  5. 51nod1089(最长回文子串之manacher算法)

    题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 题意:中文题诶~ 思路: 我前面做的那道回文子串的题 ...

  6. LeetCode 5 Longest Palindromic Substring manacher算法,最长回文子序列,string.substr(start,len) 难度:2

    https://leetcode.com/problems/longest-palindromic-substring/ manacher算法相关:http://blog.csdn.net/ywhor ...

  7. 求最长回文子串:Manacher算法

    主要学习自:http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html 问题描述:回文字符串就是左右 ...

  8. 【转】最长回文子串的O(n)的Manacher算法

    Manacher算法 首先:大家都知道什么叫回文串吧,这个算法要解决的就是一个字符串中最长的回文子串有多长.这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文 ...

  9. 字符串匹配--manacher算法模板

    manacher算法主要是处理字符串中关于回文串的问题的,它可以在 O(n) 的时间处理出以字符串中每一个字符为中心的回文串半径,由于将原字符串处理成两倍长度的新串,在每两个字符之间加入一个特定的特殊 ...

随机推荐

  1. sql server 事务处理

    事物处理   事务是SQL Server中的单个逻辑单元,一个事务内的所有SQL语句作为一个整体执行,要么全部执行,要么都不执行. 事务有4个属性,称为ACID(原子性.一致性.隔离性和持久性)   ...

  2. js如何判断一个数组

    typeof [] 为一个"object" 不能通过此方法判断一个数组 方法 1.instanceof方法,这个方法用的比较多. 2.这个是es5以后推荐的方法,Object.pr ...

  3. Matlab中的向量

    1.             向量的创建 1)直接输入: 行向量:a=[1,2,3,4,5] 列向量:a=[1;2;3;4;5] 2)用“:”生成向量 a=J:K 生成的行向量是a=[J,J+1,…, ...

  4. Javascript/jQuery 获取地址栏URL参数的方法

    1.jquery获取url很简单,代码如下 window.location.href; 2.javascript获取url参数 function getUrlParam(name) { var reg ...

  5. RecyclerView的使用(一)

    RecyclerView是Android5.0推出的用来替代ListView和GridView的控件. 使用RecyclerView也很简单,不过需要先引入support-v7中的RecyclerVi ...

  6. 路由知识之ip route 命令中的疑惑

    1.基础知识 1.1 路由 (Routing) 1.1.1 路由策略 (使用 ip rule 命令操作路由策略数据库) 基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目 ...

  7. 【BZOJ 1492】【NOI 2007】货币兑换Cash

    这是道CDQ分治的例题: $O(n^2)$的DP: f [1]←S* Rate[1] / (A[1] * Rate[1] + B[1]) Ans←SFor i ← 2 to n For j ←1 to ...

  8. nginx正向代理,反向代理,透明代理(总结)

    1正向代理 正向代理,也就是传说中的代理,他的工作原理就像一个跳板, 简单的说, 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器 这个代理服务器呢,他能访问那个我不能访问的网站 于是我先连 ...

  9. ES6新特性:let和const的使用

    (声明, 本文的所有代码均在node的最新稳定版本v4.4.3中执行的, 如果在浏览器中执行请把JS的运行环境提升为ES6) 以前一直用var定义变量, 现在有了两种新的定义变量的方式, 1: let ...

  10. RequireJS实例分析【转】

    转自http://www.cnblogs.com/xing901022/p/4658548.html 随着JS越来越庞大,已经不仅仅是以前复制粘贴做特效的时代了,JS越来越偏向于业务逻辑与应用.恰逢N ...