manacher-模板-hd-3068
/*
题意:给一个字符串,求该串的最长回文串的长度;
算法:Manacher
O(n)复杂度,求以每一个字符为中心的最长汇文串的长度;
这个算法把奇数和偶数的情况和在一起来考虑了;
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int p[];
char s[],str[];
/*
首先第一步是将原来的串扩展。避免奇偶分类讨论,在开头设置一个不用的东西,从1开始用#分隔;
字符串的长度相应的改变;
最后要记得在新串的最后加\0;
*/
void init()
{
str[]='@';
str[]='#';
for(int i=;i<n;i++)
{
str[i*+]=s[i];
str[i*+]='#';
}
n=*n+;
str[n]=;
}
/*
计算以每一个字符作为中心的最长回文串的长度,但是在后面可以进行剪枝,避免多余的比较,就是利用已有的回文串,在前面的某个字符作为中心的情况计算过了的话就可以直接用它的数据,因为他们在对称的位置上,在一定的范围内周边的字符是一样的,id就是用来记录上一个回文串的中心是哪一个,用来计算对称位置用的,最后扫一遍p数组,结果减一;
*/
void pk()
{
int mx=,id=;
for(int i=;i<n;i++)
{
if(mx>i)
{
p[i]=min(p[*id-i],p[id]+id-i);
//p[id*2-i]表示i的对称位置上的那个字符的回文串长度,p[id]+id-i表示的是以id为中心的回文串的边界距离i的距离,在这个距离以内的都可用对称点的数据,超出的就得自行比较了;省下一部分的比较;
}
else
p[i]=;
for(;str[i+p[i]]==str[i-p[i]];p[i]++);
if(mx<p[i]+i)
{
//mx记录回文串的最远的边界;
mx=p[i]+i;
id=i;
}
}
}
int main()
{
while(scanf("%s",s)!=EOF)
{
memset(p,,sizeof(p));
n=strlen(s);
init();
pk();
int ans=;
for(int i=;i<n;i++)
{
if(p[i]>ans)
ans=p[i];
}
printf("%d\n",ans-);
} return ;
}
manacher-模板-hd-3068的更多相关文章
- HDU 3068 最长回文(manacher模板题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题目大意:求字符串s中最长的回文子串 解题思路:manacher模板 代码 #include&l ...
- HDU 3068 最长回文( Manacher模板题 )
链接:传送门 思路:Manacher模板题,寻找串中的最长回文子串 /***************************************************************** ...
- ural 1297 Palindrome(Manacher模板题)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 求最长回文子串. http://acm.timus.ru/problem.aspx ...
- 最长回文 HDU - 3068 manacher 模板题
题意:找串的最长回文字串(连续) 题解:manacher版题 一些理解:首位加上任意两个字符是为了判断边界. 本算法主要是为了 1.省去奇偶分类讨论. 2.防止形如aaaaaaa的串使得暴力算法蜕化为 ...
- HDU3068:最长回文(Manacher模板)
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Manacher模板( 线性求最长回文子串 )
模板 #include<stdio.h> #include<string.h> #include<algorithm> #include<map> us ...
- Palindrome - POJ 3974 (最长回文子串,Manacher模板)
题意:就是求一个串的最长回文子串....输出长度. 直接上代码吧,没什么好分析的了. 代码如下: ================================================= ...
- manacher 模板
求最长回文子序列的 O(n)做法 讲解 #include <iostream> #include <cstdio> #include <algorithm> #in ...
- manacher模板(manacher)
洛谷题目传送门 写完有一段时间了,发现板子忘记存在了这里...... 算法简述 一种字符串算法,\(O(n)\)高效求出以每个字符为对称中心的最长回文串长度. 然后,就可以进一步求出全串中最长回文串的 ...
- 最长回文(manacher模板)
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> us ...
随机推荐
- [论文理解]Selective Search for Object Recognition
Selective Search for Object Recognition 简介 Selective Search是现在目标检测里面非常常用的方法,rcnn.frcnn等就是通过selective ...
- 用函数求lnx,lgx等
https://blog.csdn.net/liujian20150808/article/details/50628061
- 2018.3.16 win 关闭自动更新代码
新建一个文本文件修改后缀名为 .bat 格式 net stop wuauserv sc config wuauserv start=disabled shutdown -r -t 1
- IEDA的安装与破解
百度搜索IDEA 进入官网下载 https://www.jetbrains.com/idea/download/#section=windows 2.下载好双击即可 3. 完成破解
- Tomcat:使用startup.bat启动tomcat遇到报错
问题:使用startup.bat启动tomcat的时候报错,按照网页上的办法都试了一遍,但是没有解决问题.命令窗口启动tomcat会一闪而过,然后退出. 解决:1 检查环境变量配置是否有问题: CAT ...
- java,编写一个从1循环到150并在每行打印一个值,另外在每个3的倍数行上打印出foo,在每个5的倍数行上打印biz,在每个7的倍数上打印baz.
需求:编写一个从1循环到150并在每行打印一个值,另外在每个3的倍数行上打印出foo,在每个5的倍数行上打印biz,在每个7的倍数上打印baz. package study01; public cla ...
- mac 升级EI Capitan后遇到c++转lua时遇到libclang.dylib找不到的错
升级EI Capitan后,打包lua脚本时,会报这个错: LibclangError: dlopen(libclang.dylib, 6): image not found. To provide ...
- 2d游戏中求出一个向量的两个垂直向量
function cc.exports.VerticalVector(vec)--求出两个垂直向量 local result = {} result[1] = cc.p(vec.y/vec.x,-1) ...
- 【原】基于matlab的蓝色车牌定位与识别---绪论
本着对车牌比较感兴趣,自己在课余时间摸索关于车牌的定位与识别,现将自己所做的一些内容整理下,也方便和大家交流. 考虑到车牌的定位涉及到许多外界的因素,因此有必要对车牌照的获取条件进行一些限定: 一.大 ...
- python列表之append与extend方法比较
append和extend是列表的两种添加元素方式,但这两种方式却又有些不同之处.那么不同之处在哪里呢,我们通过对二者的定义和实例来看一看. list.append() 1.定义:L.append(o ...