这是上上周天机房一位神仙讲的,\(gu\)了这么久才来整理\(w\),神仙讲的基本思路已经全都忘记了,幸好的是神仙写了\(blog\),吹爆原博浅谈\(Manacher\)算法,以及原博神仙\(ych\)!

再吹一波\(ych\):



太巨了!

\(Manacher\)是一种\(O(n)\)求回文字符子串的算法。(然后迷惑的记得当时问神仙\(ych\)一个sha diao问题:子串是连续的嘛?显然这里的回文子串是连续的;

\(Solution:\)

对于一串字符串,对于其中的每一个字符我们都维护一个\(R[i]\)表示这个字符串的最长回文半径,但是这个时候出现了\(bug\):

\(ykyyky\)

\(ykykyky\)

对于前一个子串,是偶数回文子串,而后一个回文子串是奇数回文子串。这个时候我们该怎么表示它们回文半径的差别?\(3\)和\(3.5\)?✘ 这个时候我们可以在每个字符串之间加‘\(\#’\)

\(\#y\#k\#y\#y\#k\#y\#\)

\(\#y\#k\#y\#k\#y\#k\#y\#\)

于是这样它们的回文半径就唯一确定了;

看处理:\(R[i]\)表示最长回文半径,当我们求得每个位置的\(R[i]\),当加了\('\#'\)之后,\(R[i]_{max}-1\)就是我们要求的最长回文串长度(感性 举例李姐

怎么处理?

求\(R[i]\)

设前\(i-1\)个数中的回文串的右端点的最大值为\(r\),取得最大右端点的数为\(mid\)。显然\(r=mid+R[mid]\)

\(\mathfrak{A}.\)\(i\leq r\)

计算\(i\)关于\(mid\)的对称点\(j=mid*2-i\),

\(\mathfrak{a}.\)\(j-R[j]>mid-R[mid]\),即\(i\)的对称点的回文串的范围包含在\(mid\)对应点的回文串范围,那么\(i\)的回文串和\(j\)的回文串一定是对称分布的(因为\(i、j\)关于\(mid\)对称并且在\(mid\)的回文半径内),则\(R[i]=R[j]\)

\(\mathfrak{b}.\) \(j-R[j]\leq mid-R[mid]\),则此时关于\(i、j\)关于\(mid\)对称分布并且在\(mid\)回文半径内的一定是对称的,但是在回文半径之外是否对称我们不清楚,因此我们用最简单粗暴的办法:暴力拓展;

\(\mathfrak{B}.i>r\)

于是暴力拓展√

在每次完成以上三项后,尝试更新\(r、mid\):

if(r<i+R[i]) {
r=i+R[i]-1;
mid=i;
}

然后复杂度不会证,(一定是我太菜了.

\(Code:\)

码量不是很大,注意字符串头尾都要插入一个\('\#'\)

#include<bits/stdc++.h>

using namespace std;

char s[22000703];
int R[22000703],len; void read() {
char ch=getchar();
s[0]='~';s[++len]='#';
while(ch>'z'||ch<'a') ch=getchar();
while(ch>='a'&&ch<='z') s[++len]=ch,s[++len]='#',ch=getchar();
} int main () {
read();
int r=0,mid=0,ans=0;
for(int i=1;i<=len;i++) {
if(i<=r) R[i]=min(R[2*mid-i],r-i+1);
while(s[i-R[i]]==s[i+R[i]]&&s[i-R[i]]!='~') ++R[i];
if(r<i+R[i]) {
r=i+R[i]-1;
mid=i;
}
ans=max(ans,R[i]);
}
printf("%d",ans-1);
return 0;
}

跟风Manacher算法整理的更多相关文章

  1. 浅谈Manacher算法与扩展KMP之间的联系

    首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解.网上解法颇多.时间复杂度也不尽同样,这里列述几种常见的解法. 解法一   ...

  2. ACM -- 算法小结(八)字符串算法之Manacher算法

    字符串算法 -- Manacher算法 首先介绍基础入门知识,以下这部分来着一贴吧,由于是很久之前看的,最近才整理一下,发现没有保存链接,请原创楼主见谅. //首先:大家都知道什么叫回文串吧,这个算法 ...

  3. HDU3068 回文串 Manacher算法

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

  4. manacher算法专题

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 【NOIP2016提高A组模拟8.15】Garden

    题目 分析 其实原题就是[cqoi2012][bzoj2669]局部极小值. 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次.如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点) ...

  2. 23.二叉搜索树的后序遍历(python)

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 这道题特别傻的地方: 当输入sequence为空时 ...

  3. 带 like 的字符串匹配查询

    1.百分号通配符  '%'  ,匹配任意长度的字符,甚至包括零字符 例:查询所有以  'a'  字母开头的水果,sql 语句如下 select f_id,f_name from fruits wher ...

  4. 用Java 实现断点续传 (HTTP)

    在web项目中上传文件夹现在已经成为了一个主流的需求.在OA,或者企业ERP系统中都有类似的需求.上传文件夹并且保留层级结构能够对用户行成很好的引导,用户使用起来也更方便.能够提供更高级的应用支撑. ...

  5. MongoDB接口类函数

    [接口类定义] [java] view plaincopy /** * 项目名:SpiderCrawler * 文件名:MongoDBDao.java * 描述:TODO(用一句话描述该文件做什么) ...

  6. 激活navicat premium12

    按Win键和R键打开运行并输入cmd并回车或Win10 开始菜单右键,打开命令提示符或者命令提示符(管理员) ,建议使用命令提示符(管理员) 最为稳妥. 1.首先使用cd命令切换到当前Navicat ...

  7. android图片的缩放、圆角处理

    android中图片缩放方法有三种:1,bitmapFactory:2,bitmap+metrix:3,thumbUtil 方法一:bitmapFactory: public static Bitma ...

  8. MongoDB通过JavaDriver执行shell命令,例如创建sharding collection

    Mongodb的java driver本身的接口 void createCollection(String collectionName, CreateCollectionOptions create ...

  9. 【HTTP/FTP客户端库】

    [HTTP/FTP客户端库]资料来源:http://curl.haxx.se/libcurl/competitors.html Free Software and Open Source projec ...

  10. kafka-manager怎么查看topic里的数据量

    https://jingyan.baidu.com/article/eb9f7b6d367679869364e8d4.html