P3805 【模板】manacher算法

题目大意

n个字符组成的字符串,求最长回文串

$O$$($$n^3$$)$

枚举两端点,暴力往中间搜

$O$$($$n^2$$)$

枚举回文串终点,暴力往两边搜

$O$$($$n$$)$

$first:$

$j$与$i$关于$pos$对称,$S$为以$pos$为中间的回文串,$Maxright$为$S$的右端点,$s_1$为以$j$为中间的回文串

$s_2$为以$i$为中间的回文串

下面开始将$manacher$,要降低复杂度,就要减少重复的操作

$(1)$ $s_1$被$S$包含(且没到端点)

显然根据回文的性质$len_{s_1}$=$len_{s_2}$

$(2)$  $s_1$超过或触及端点

这时,我们只能确定,两条蓝线之间的部分(即不超过$Maxright$的部分)是回文的

于是从这个长度开始,从$i$的左右两边搜一遍,当左右字符不同,或者到达边界时停止

$(3)$ 当$i$在$Maxright$的右边

$s_2$还没有任何部分被访问过,只能从$i$的左右两边搜一遍,当左右字符不同,或者到达边界时停止

ps:记得要时刻更新$Maxright$和$pos$

My complete code:

#include<cstdio>
#include<cstring>
using namespace std;
int n,ans; int hw[22000010];
char a[11000010],s[22000010];
inline int MIN(int g1,int g2){
return g1<=g2?g1:g2;
}
inline int MAX(int g1,int g2){
return g1>=g2?g1:g2;
}
inline void change(){
s[0]=s[1]='#';
for(int i=0;i<n;i++){
s[i*2+2]=a[i];
s[i*2+3]='#';
}
n=n*2+2;
s[n]=0;
}
inline void manacher(){
int maxright=0,mid=0;
for(int i=1;i<n;i++){
if(i<maxright)
hw[i]=MIN(hw[(mid<<1)-i],maxright-i);
else
hw[i]=1;
while(s[i+hw[i]]==s[i-hw[i]])
++hw[i];
if(hw[i]+i>maxright){
maxright=hw[i]+i;
mid=i;
}
}
}
int main(){
scanf(" %s",a);
n=strlen(a);
change();
manacher();
for(int i=0;i<n;++i)
ans=MAX(ans,hw[i]);
printf("%d",ans-1);
return 0;
}

  

manacher小结的更多相关文章

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

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

  2. LeetCode Monotone Stack Summary 单调栈小结

    话说博主在写Max Chunks To Make Sorted II这篇帖子的解法四时,写到使用单调栈Monotone Stack的解法时,突然脑中触电一般,想起了之前曾经在此贴LeetCode Al ...

  3. Manacher(马拉车)学习笔记

    Manacher可以有效的在\(O(n)\)时间内解决一个字符串的回文子串的题目 目录 简介 讲解 推介 简单的练习 恐怖的练习QAQ 小结 简介 开头都说了,Manacher是目前解决回文子串的最有 ...

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

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

  5. 从零开始编写自己的C#框架(26)——小结

    一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...

  6. Python自然语言处理工具小结

    Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 目录 [Python NLP]干货!详述Python NLTK下如何使用stanford NLP工具包(1) [ ...

  7. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  8. iOS--->微信支付小结

    iOS--->微信支付小结 说起支付,除了支付宝支付之外,微信支付也是我们三方支付中最重要的方式之一,承接上面总结的支付宝,接下来把微信支付也总结了一下 ***那么首先还是由公司去创建并申请使用 ...

  9. iOS 之UITextFiled/UITextView小结

    一:编辑被键盘遮挡的问题 参考自:http://blog.csdn.net/windkisshao/article/details/21398521 1.自定方法 ,用于移动视图 -(void)mov ...

随机推荐

  1. Mysql中delimiter作用

    1. delimiter delimiter是mysql分隔符.在mysqlclient中分隔符默认是分号(:). 假设一次输入的语句较多,而且语句中间有分号,这时须要新指定一个特殊的分隔符. 2. ...

  2. VC++动态链接库(DLL)编程深入浅出(三)

    前面我们对非MFC DLL进行了介绍,这一节将详细地讲述MFC规则DLL的创建与使用技巧. 另外,自从本文开始连载后,收到了一些读者的e-mail.有的读者提出了一些问题,笔者将在本文的最后一次连载中 ...

  3. sql字符串处理

    sql字符串截取 substring(ParamName,start,length) start开始位置,length结束位置 DECLARE @Tel NVARCHAR(20) SET @Tel=' ...

  4. 一篇文章说完Java的垃圾回收过程

    想要了解java的垃圾回收过程首先要理解java堆的内存模型,简单表示如下:   从上面的图片可以看出,java的堆内存可以简单的分为,新生代和老年代,在新生代中有分为三个区域,1个Eden区和2个S ...

  5. 总结java编程常用的快捷键

    Eclipse 常用快捷键 Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键. 1. [ALT+/] 此快捷键为用户 ...

  6. Linux禁止Ctrl+Alt+Del重新启动

    方法1:改动/etc/inittab 屏蔽 ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now 或者删除改行内容 保存退出 适用对象:RedHat4.8 ...

  7. [Android Studio 权威教程]最有用的快捷键

    上篇中我们讲了Android Studio怎样加入插件.这篇我们讲讲AS的快捷键.这里我说明的快捷键都是最最有用的,希望刚刚加入AS的朋友尽快的熟悉一下这几个快捷键,这样能够帮助你提高coding的效 ...

  8. servletResponse 实用的页面跳转技术和定时刷新技术

    package response; import java.io.IOException;import java.util.Random; import javax.servlet.ServletEx ...

  9. Nginx负载均衡简易配置

    多台Web服务器水平扩展,进行负载均衡对外服务,是一种很常见的方案. 常用方法用DNS轮询,LVS. DNS轮询虽然有配置简单的有点,但无法实现健康检查,DNS修改需要较长时间失效,对于无域名的内部服 ...

  10. 数据库ACID操作---事务四原则

    事务操作四原则: 1>原子性:简单来说——整个事务操作如同原子已经是物理上最小的单位,不可分离事务操作要么一起成功,要么一起失败. 2>一致性:倘若事务操作失败,则回滚事务时,与原始状态一 ...