HDU - 3068

Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u

Submit Status

Description

给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 
回文就是正反读都是一样的字符串,如aba, abba等

Input

输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S 
两组case之间由空行隔开(该空行不用处理) 
字符串长度len <= 110000

Output

每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度. 

Sample Input

aaaa

abab

Sample Output

4
3

Source

题目要求求出最长回文子串,是一道manacher的模板题。

我们先讲一下manacher,我们先处理一下字符串,把字符串处理成#a#a#这样的格式,比如abcd处理成#a#b#c#d#,这样的好处是解决了判断回文串是奇数和偶数的问题,把回文串强制变成奇数。接下来,定义一个p[]数组,p[i]代表以节点i为中心的最长回文串的半径。例如aaaa这个字符串,p[0]=p[3]=1,p[1]=p[2]=2。同时我们定义一个变量mx和id,mx代表当前判断过的回文子串最长延伸(往右)到哪里,可以理解为当前判断过的回文子串到达的最大下标。而id代表当前更新的mx值所对应的回文串的中心的下标。如果不是很清楚可以直接看下代码。剩下部分直接看代码注释吧。最好自己在纸上画一下

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define X first
#define Y second
#define clr(u,v); memset(u,v,sizeof(u));
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=2e5+;//注意开两倍大小
const int INF=0x3f3f3f3f;
char s[maxn],str[maxn];//s为原字符串,str为处理后的字符串
int p[maxn];//p[i]代表以i为中心的回文串的最长半径
int len1,len2;//分别代表s的长度和str的长度
void init()//预处理出str
{
len1=strlen(s);
str[]='$';//在首位加一个特殊字符,防止越界
str[]='#';
for (int i=;i<len1;i++)
{
str[*i+]=s[i];
str[*i+]='#';
}
len2=len1*+;
str[len2]='\0';//不能和首位字符一样
}
void manacher()
{
int mx=,id=;
for (int i=;i<len2;i++)
{
if (mx>i) //如果当前的i在mx以内,说明i为我们之前求的回文串的范围里面
     p[i]=min(p[*id-i],mx-i);//2*id-i代表i关于id对称的下标,我们前面求出他是回文串,因此具备了对称性,而2*id-i一定小于i,我们的i是从左到右扫描的,所以p[2*id-i]一定处理出来了,所以我们可以直接用p[2*id-i]的值,但是他不能超过mx-i,因为超过mx值我们就不能保证它是回文串,所以取二者最小
else p[i]=;//如果i不在回文串的范围内,则初始化p[i]=1;
for (;str[i-p[i]]==str[i+p[i]];p[i]++);//暴力往两边匹配,找到以i为中心的最长回文串
if (mx<i+p[i])更新mx值和id值
{
mx=i+p[i];
id=i;
}
}
}
int solve()
{
int ans=;
for (int i=;i<len2;i++)
if (ans<p[i]) ans=p[i];//找最大的p[i]就是答案
return ans-;
}
int main()
{
while (~scanf("%s",s))
{
init();
manacher();
printf("%d\n",solve());
}
return ;
}

HDU - 3068 最长回文(manacher)的更多相关文章

  1. hdu 3068 最长回文 manacher算法(视频)

    感悟: 首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接:戳戳戳 感觉这种花费自己时间去教别人的人真的很伟大. manacher算法把所有的回文都变 ...

  2. hdu 3068 最长回文 manacher

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正 ...

  3. hdu 3068 最长回文(manacher&amp;最长回文子串)

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

  4. hdu 3068 最长回文(manacher入门)

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

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

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

  6. HDU 3068 最长回文 manacher 算法,基本上是O(n)复杂度

    下面有别人的比较详细的解题报告: http://wenku.baidu.com/view/3031d2d3360cba1aa811da42.html 下面贴我的代码,注释在代码中: #include ...

  7. HDU 3068 最长回文 Manacher算法

    Manacher算法是个解决Palindrome问题的O(n)算法,能够说是个超级算法了,秒杀其它一切Palindrome解决方式,包含复杂的后缀数组. 网上非常多解释,最好的解析文章当然是Leetc ...

  8. hdu 3068 最长回文(manachar求最长回文子串)

    题目连接:hdu 3068 最长回文 解题思路:通过manachar算法求最长回文子串,如果用遍历的话绝对超时. #include <stdio.h> #include <strin ...

  9. hdu 3068 最长回文 (Manacher算法求最长回文串)

    参考博客:Manacher算法--O(n)回文子串算法 - xuanflyer - 博客频道 - CSDN.NET 从队友那里听来的一个算法,O(N)求得每个中心延伸的回文长度.这个算法好像比较偏门, ...

随机推荐

  1. Cocos2d-x--Box2D使用GLES-Render.h渲染查看刚体

    分为两部分:文件拷贝和代码实现 1.文件拷贝: 在TestCpp下找到GLES-Render.h和GLES-Render.cpp两个文件 复制到G:\cocos2d-2.1rc0-x-2.1.3\co ...

  2. java.lang.IllegalArgumentException: Wrong FS ...异常的解决

    配置完Hbase后,启动,JPS发现少了HMaster这个进程.查看了一下日志如下: java.lang.IllegalArgumentException: Wrong FS: hdfs://192. ...

  3. vps使用(centos)

    javaweb开发,vps来做个人测试 首先配置vps(centos) 1.安装javeweb环境 用ssh远程服务器后,中文乱码,因为ssh的字符集和服务器的字符集不一致,服务器是utf-8,可以通 ...

  4. vsftpd配置seccomp_sandbox=NO

    在ubuntu14.04 配置vsftp时如果不加上seccomp_sandbox=NO这一句会出现莫名的530错误

  5. Js-Html 前端系列--显示有格式的文本

    var dp = $("#dp").val(); var dpXSS = filterXss(dp); document.getElementById("descript ...

  6. 蓝桥杯 C语言 入门训练 序列求和

    问题描述 求1+2+3+...+n的值. 输入格式 输入包括一个整数n. 输出格式 输出一行,包括一个整数,表示1+2+3+...+n的值. 样例输入 4 样例输出 10 样例输入 100 说明:有一 ...

  7. OSI模型第一层物理层

    纪念我曾今热爱的数通(^o^). 物理层 一句话概述: OSI的第一层,它虽然处于最底层,却是整个开放系统的基础.物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境. 常见设备 ...

  8. iOS NSNotificationCenter 移除通知带来的crash

    Where to remove observer for NSNotification? 在dealloc方法中移除通知观察者带来crash NSNotificationCenter中的通知消息已经发 ...

  9. feature2d相关

    1.Harris角点检测 是基于灰度图像的角点检测. 灰度变化率函数如下: 其中的w(x,y)为加权函数,可为常数或为高斯函数.之后对E(u,v)进行泰勒级数的展开与化简,最终得到 ,,Ix,Iy是图 ...

  10. FileOutputStream flush()

    FileOutputStream 继承 OutputStream ,flush方法查看源码方法体为空,所以flush没起到清除缓存的作用 改用BufferedOutputStream再调用flush( ...