https://segmentfault.com/a/1190000008484167?tdsourcetag=s_pctim_aiomsg 讲的超好!

manacher算法理解
回文串分为偶回文串和奇回文串,由于偶回文串无法找到中点,所以这里将偶回文串转换为奇回文
转换方法s="abcde"=>s="$#a#b#c#d#e#"
数组p[i],表示以i为中心的最长回文的半径,p[i]-1刚好是以i为中心的源字符串中的回文长度
从左往右扫描s,求出p数组
mx:延伸到最右边的回文的边界(不包含 )
id:mx对应的中点
现在扫到了i,i关于id对称点是j,p[j]已知,以下分三种种情况
1.i<mx:p[i]=min(p[j],mx-i),i在mx左边
2.i>=mx:p[i]=1 ,i在mx的右边
3.往两边拓展边界
求出p[i]后更新mx即可 为什么复杂度是on?
当且仅当j的边界和mx重合时,i才要向两边扩展,
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
char s[maxn],s_new[maxn];
int p[maxn];
int init(){
int len=strlen(s);
s_new[]='$',s_new[]='#';
int j=;
for(int i=;i<len;i++)
s_new[j++]=s[i],s_new[j++]='#';
s_new[j]='\0';
return j;
}
int manacher(){
int len=init();
int res=,id,mx=;
for(int i=;i<len;i++){
if(i<mx)
p[i]=min(p[*id-i],mx-i);
else
p[i]=;
//当且仅当边界处于mx的时候(两边的匹配状况未知),才会进入循环
while(s_new[i-p[i]]==s_new[i+p[i]])
p[i]++;
if(mx<i+p[i])
mx=i+p[i],id=i;
res=max(res,p[i]-);
}
return res;
} int main(){
cin>>s;
cout<<manacher();
}

poj3974

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define maxn 3000005
int p[maxn],tt;
char s[maxn],s_new[maxn];
int init(){
int len=strlen(s);
s_new[]='$',s_new[]='#';int j=;
for(int i=;i<len;i++)
s_new[j++]=s[i],s_new[j++]='#';
s_new[j]=;
return j;
}
int manacher(){
int len=init();
int mx=,id,res=;
for(int i=;i<len;i++){
if(i<mx)p[i]=min(p[*id-i],mx-i);
else p[i]=;
while(s_new[i+p[i]]==s_new[i-p[i]])p[i]++;
if(i+p[i]>mx)
mx=i+p[i],id=i;
res=max(res,p[i]-);
}
return res;
}
int main(){
while(scanf("%s",s)){
if(s[]=='E')break;
memset(p,,sizeof p);
printf("Case %d: %d\n",++tt,manacher());
}
}

马拉车算法——poj3974的更多相关文章

  1. Manacher's Algorithm 马拉车算法

    这个马拉车算法Manacher‘s Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这 ...

  2. 字符串(马拉车算法,后缀数组,稀疏表):BZOJ 3676 [Apio2014]回文串

    Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. Input 输入只有一行 ...

  3. 小白月赛13 B小A的回文串 (马拉车算法求最长回文子串)

    链接:https://ac.nowcoder.com/acm/contest/549/B来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...

  4. BZOJ 2342: [Shoi2011]双倍回文 马拉车算法/并查集

    2342: [Shoi2011]双倍回文 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1123  Solved: 408 题目连接 http://w ...

  5. 2015 UESTC 搜索专题M题 Palindromic String 马拉车算法

    Palindromic String Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/s ...

  6. 647. Palindromic Substrings(马拉车算法)

    问题 求一个字符串有多少个回文子串 Input: "abc" Output: 3 Input: "aaa" Output: 6 思路和代码(1)--朴素做法 用 ...

  7. Manacher's Algorithm 马拉车算法(最长回文串)

    这个马拉车算法Manacher‘s Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这 ...

  8. 马拉车算法(Manacher's Algorithm)

    这是悦乐书的第343次更新,第367篇原创 Manacher's Algorithm,中文名叫马拉车算法,是一位名叫Manacher的人在1975年提出的一种算法,解决的问题是求最长回文子串,神奇之处 ...

  9. HDU - 3068 最长回文manacher马拉车算法

    # a # b # b # a # 当我们遇到回判断最长回文字符串问题的时候,若果用暴力的方法来做,就是在字符串中间添加 #,然后遍历每一个字符,找到最长的回文字符串.那么马拉车算法就是在这个基础上进 ...

随机推荐

  1. 常见排序算法总结:插入排序,希尔排序,冒泡排序,快速排序,简单选择排序以及java实现

    今天来总结一下常用的内部排序算法.内部排序算法们需要掌握的知识点大概有:算法的原理,算法的编码实现,算法的时空复杂度的计算和记忆,何时出现最差时间复杂度,以及是否稳定,何时不稳定. 首先来总结下常用内 ...

  2. [luogu1600]NOIp2016D1T2 天天爱跑步

    题目链接: luogu1600 谨以此题纪念那段年少无知但充满趣味的恬淡时光 附上一位dalao的博客链接:https://www.luogu.org/blog/user26242/ke-pa-di- ...

  3. SaltStack说明文档

    SaltStack说明文档 master安装 # 安装 yum -y install salt-master salt-minion salt-ssh # 启动 systemctl start sal ...

  4. 【BZOJ4028】[HEOI2015]公约数数列(分块)

    [BZOJ4028][HEOI2015]公约数数列(分块) 题面 BZOJ 洛谷 题解 看一道题目就不会做系列 首先\(gcd\)最多只会有\(log\)种取值,所以我们可以暴力枚举出所有可能的\(g ...

  5. 使用ubuntu做为dotnet core开发环境

    一.安装google浏览器 1.下载安装包(传送门:http://www.google.cn/intl/zh-CN/chrome/browser/desktop/index.html) 2.使用sud ...

  6. HF-01

    胡凡 本书在第2章对C语言的语法进行了详细的入门讲解,并在其中融入了部分C+的特性. 第3-5章是 入门部分. 第3章 初步训练读者最基本的编写代码能力: 第4章对 常用介绍,内容重要: 第5章是   ...

  7. Linux-高可用Keepalived概念篇

    keepalived 高可用 Keepalived介绍 Keepalived 软件起初是专为 LVS 负载均衡软件设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可 ...

  8. 文件上传XSS引发的安全问题

    文件上传xss,一般都是上传html文件导致存储或者反射xss 一般后缀是html,之前疏忽了,没怎么考虑文件上传xss 如果没有 验证文件内容,却验证了后缀的情况下,使用: htm后缀: 测试代码: ...

  9. Oracle windows64位 百度云下载链接

    oracle11g安装包 去官网需要登录 这个是百度云盘链接 链接:https://pan.baidu.com/s/18lYrkqqHG8u4aDdQekHc3g 提取码:fg2v

  10. python timeit模块用法

    想测试一行代码的运行时间,在python中比较方便,可以直接使用timeit: >>> import timeit #执行命令 >>> t2 = timeit.Ti ...