这是上上周天机房一位神仙讲的,\(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. 014:Django内置的URL转换器

    Django内置的URL转换器: 上节中我们说了URL中传参的情况,传递参数是通过 <> 尖括号来进行指定的.并且在传递参数的时候,可以指定这个参数的数据类型,比如文章的 id 都是 in ...

  2. 【mysql】利用全文索引实现中文的快速查找

    现在我们数据库表中的记录大约在17万,每一条记录都有name字段,根据name做模糊匹配,效率非常低下. 表结构如下: create table T ( id int, name ) ); 总数据量如 ...

  3. canal 环境搭建 kafka Zookeeper安装(二)

    第一步 创建Zookeeper 下载完成后 修改 Zookeeper中的 zoo.cfg 修改 dataDir .dataLogDir 集群模式 server.1=ServerIP:2888:3888 ...

  4. linux 配置内网yum源

    一.yum服务器端配置1.安装FTP软件#yum install vsftpd #service vsftpd start#chkconfig --add vsftpd#chkconfig vsftp ...

  5. k8s-dashboard搭建

    一,简单搭建,未使用ssl证书,可载谷歌浏览器访问 1,拉取镜像 docker pull gcrxio/kubernetes-dashboard-amd64:v1.10.1 docker tag gc ...

  6. C/C++中的转义字符

    在C语言中有三种转义字符,它们是:一般转义字符.八进制转义字符和十六进制转义字符. 1.一般转义字符 这种转义字符,虽然在形式上由两个字符组成,但只代表一个字符.常用的一般转义字符为: \a \n \ ...

  7. SQL 行转列(列的值不规则的数目)

    --创建一个临时表用来存储数据 create table #tmp_SNValue_Table (FieldName nvarchar(20), [Value] nvarchar(max)) inse ...

  8. React 项目 ant design 的 CheckboxGroup 验证

    使用 ant design 提供的 getFieldDecorator 进行验证 一般开始使用默认选中 <FormItem> {getFieldDecorator('checkProtoc ...

  9. Python黑科技:FuckIt.py

    说起 Python 强大的地方,你可能想到是它的优雅.简洁.开发速度快,社区活跃度高.但真正使得这门语言经久不衰的一个重要原因是它的无所不能,因为社区有各种各样的第三库,使得我们用Python实现一个 ...

  10. json 的简单应用

    今天做爬虫时的一点盲区 :字符串, 字典,写到同一个文件中.难以利用!比如这样的数据:str = “hi,budy. i like 52pojie!”dirt = {“陈墨”:["男&quo ...