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. c++字符串连接方法大观

    c++字符串连接方法大观 抛砖引玉: springf(config_itemID[i],"ItemID%s_%d",i,i); 大家说说自己都用什么方法,个有什么利弊呢?

  2. Android 音频管理器AudioManager

    音频管理器AudioManager,通过它可以管理android系统的音量或直接让系统静音,依旧是通过调用getSystemService()方法获取音频管理器AudioManager对象,获取到该对 ...

  3. Servlet的ClassLoader

    摘自深入java web技术内幕修订版

  4. ICSharpCode.TextEditor如何自定义代码折叠和高亮

    ICSharpCode.TextEditor 是一款非常不错的.NET代码编辑控件,内置了多种高亮语言支持,同时完美支持中文,非常赞!先来看一下运行效果: 1 项目结构 这里需要注意lib文件夹下导入 ...

  5. 前端工具 - 15个最佳的 JavaScript 表单验证库

    客户端验证在任何项目都是不够的,因为 JavaScript 可以直接忽略,人们可以提交请求到服务器. 然而这并不意味着客户端验证都没必要了,很多时候我们需要在用户提交到服务器之前给予提示.JavaSc ...

  6. linux一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书)

    一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书) --------------------------目录-网络无关篇-目录-------------------------- 0001 修 ...

  7. Hololens Rest API

    通过Hololens提供的 Rest API 可以对Hololens进行远程控制和获取信息 ,可以通过第三方程序对Hololens重启或者关机,当然,还有更多更丰富的API,例如可以在PC上分流显示H ...

  8. for for-in foreach 循环

    var a = [1, 2, 3, 4, 5] //for用来便利数组元素非常简单 for (var i = 0; i < a.length; i++) { console.log(a[i]) ...

  9. find用法积累

    查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xar ...

  10. python3 流程控制

    表达式if ... else >>> if 3 > 4: ... print('False') ... else: ... print('True') ... True 表达式 ...