洛谷题目传送门

写完有一段时间了,发现板子忘记存在了这里。。。。。。

算法简述

一种字符串算法,\(O(n)\)高效求出以每个字符为对称中心的最长回文串长度。

然后,就可以进一步求出全串中最长回文串的长度,以及全串回文子串总数。

这篇博客已经讲的很清楚了。

有一个小细节还需要提一下。为了方便判断下标是否越界问题,我们可以这样做——将字符串从一号下标开始存储,然后在零号下标放一个与串中所有字符都不同的字符(包括中间插入的字符)。这样在扫到边界的时候,一定会匹配失败。这样少写了好几个if,非常方便。

其它就没什么问题了。模板如下:

#include<cstdio>
char s[23333333];
int f[23333333];
inline int min(register int x,register int y){return x<y?x:y;}
int main()
{
register int len,i,l,r,mr=0,m=0,ans=0;
s[0]='~';s[1]='%';//上面提到的小细节
for(len=2;(s[len]=getchar())>='a';len+=2)
s[len|1]='%';
for(i=1;i<len;++i)
{
if(i<mr)f[i]=min(f[(m<<1)-i],mr-i);//最大化利用前面的信息
for(l=i-f[i]-1,r=i+f[i]+1;s[l]==s[r];--l,++r,++f[i]);//继续向两侧匹配
if(mr<r-1)mr=r-1,m=i;//更新最大可行右端点
if(ans<f[i])ans=f[i];//更新最大长度
}
printf("%d\n",ans);
return 0;
}

另外,向中间插入使得字符串长度增加了一倍。我在洛谷rank榜第一名的代码中看到,这位神犇居然没插字符!时间也基本比我少一半。

我还是懒得整理啦(其实是因为我太菜了)。可能会对奇数长度回文子串和偶数长度回文字串进行分别处理吧。有兴趣的博友们可以自己研究一下哦!

manacher模板(manacher)的更多相关文章

  1. ural 1297 Palindrome(Manacher模板题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 求最长回文子串. http://acm.timus.ru/problem.aspx ...

  2. HDU 3068 最长回文(manacher模板题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题目大意:求字符串s中最长的回文子串 解题思路:manacher模板 代码 #include&l ...

  3. HDU 3068 最长回文( Manacher模板题 )

    链接:传送门 思路:Manacher模板题,寻找串中的最长回文子串 /***************************************************************** ...

  4. HDU3068:最长回文(Manacher模板)

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. 洛谷P3805 [模板]Manacher算法 [manacher]

    题目传送门 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a,b,c...y,z组成的字符 ...

  6. Manacher模板( 线性求最长回文子串 )

    模板 #include<stdio.h> #include<string.h> #include<algorithm> #include<map> us ...

  7. Palindrome - POJ 3974 (最长回文子串,Manacher模板)

    题意:就是求一个串的最长回文子串....输出长度. 直接上代码吧,没什么好分析的了.   代码如下: ================================================= ...

  8. manacher 模板

    求最长回文子序列的 O(n)做法 讲解 #include <iostream> #include <cstdio> #include <algorithm> #in ...

  9. 模板 manacher算法

    题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a,b,c...y,z组成的字符串S 输出格 ...

  10. 最长回文(manacher模板)

    #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> us ...

随机推荐

  1. Redis 学习(一) —— 安装、通用key操作命令

    一.Redis介绍 1.介绍 通常,在系统中,我们会把数据交由数据库来存储,但传统的数据库增删查改的性能较差,且比较复杂.根据 80/20 法则,百分之八十的业务访问集中在百分之二十的数据上.是否可以 ...

  2. iOS 开发 atomic 与 nonatomic 区别

    atomic :  变量默认是有该有属性的,这个属性是为了保证在多线程的情况下,编译器会自动生成一些互斥加锁的代码,避免该变量的读写不同步的问题. nonatomic  : 如果该对象无需考虑多线程的 ...

  3. NOI2009 二叉查找树 【区间dp】

    [NOI2009]二叉查找树 [问题描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左子树结点的数据值大,而比它右子树结点的数据值小.另一方面,这棵查找树中每个结点都有 ...

  4.     My GitHub

    0.引言 利用python开发,借助Dlib库捕获摄像头中的人脸,进行实时特征点标定: 图1 工程效果示例(gif) 图2 工程效果示例(静态图片) (实现比较简单,代码量也比较少,适合入门或者兴趣学 ...

  5. Git 上传 GitHub

    1.下载 2.安装 3.功能识别 3-1.查看git版本  git  --version 3-2.移除原来的版本 yum  remove git 4.配置 4-1.用户配置信息 git config ...

  6. lnmp HTTP ERROR 500

    http://www.cnblogs.com/thrillerz/p/4725409.html

  7. Git (gnome-ssh-askpass:3871): Gtk-WARNING **: cannot open display:

    在使用Git在客户端使用git push 命令提交文件到github时,出现报错 (gnome-ssh-askpass:): Gtk-WARNING **: cannot open display: ...

  8. SmileyFace——基于OpenCV的人脸人眼检测、面部识别程序

    项目地址 https://github.com/guoyaohua/SmileyFace 开发环境 Visual Studio 2010 MFC + OpenCV 功能描述 静态图像人脸检测 视频人脸 ...

  9. html、text、val、attr、prop区别。this.value和$(this).val()区别以及return用法

    html(): html() 方法返回或设置被选元素的内容 (inner HTML). 当使用该方法读取多个值时,它会返回第一个匹配元素的内容. 当使用该方法设置一个值时,它会覆盖所有匹配元素的内容. ...

  10. css在盒子中垂直居中和固定居中

    顶部固定居中 <div class="w960 fixed"> 我是固定的 </div> .w960{ width: 960px; margin:0 aut ...