最长回文

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5158    Accepted Submission(s): 1755

Problem 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
最长回文字串
一、暴力算法(O(n^3))
三个for循环
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{
char a[];
int i,j,k,maxn=;
cin>>a;
for(int i=;a[i]!='\0';i++)
a[i]=toupper(a[i]);
int len=strlen(a);
for(i=;i<len;i++)
{
for(j=i;j<len;j++)
{
int ok=;
for(k=i;k<=j;k++)
{
if(a[k]!=a[i+j-k]) ok=;
}
if(ok)maxn=max(maxn,j-i+);
}
}
cout<<maxn<<endl;
return ;
}

二、优化算法(O(n^2))ps:分奇偶讨论

确定中心字符,两边扩展。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
typedef long long ll;
int max(int a,int b){
return a>b?a:b;
}
int main()
{
char a[];
int n;
cin>>n;
while(n--)
{
int i,j,maxn=,len;
cin>>a;
len=strlen(a);
for(i=;i<len;i++)
{
for(j=;i-j>= && i+j<len;j++)
{
if(a[i-j]!=a[i+j]) break;
else maxn=max(maxn,j*+);
}
for(j=;i-j>= && i+j+<len;j++)
{
if(a[i-j]!=a[i+j+]) break;
else maxn=max(maxn,j*+);
}
}
cout<<maxn<<endl;
}
return ;
}

三、manacher算法(O(n))ps:优化后的第二种算法

在第二种算法中,每次都确定中心字符两边扩展,并且分奇偶讨论,因此每次操作都会有不必要的操作,而manacher算法就是在每两个字符之间插入'#'字符,从而不需要分奇偶讨论。确定一个中心后,找上一个中心的标记点,标记点加上标记半径判断该点的初始回文状态即p[i]=min(p[id+id-i],p[id]+id-i].

然后在p[i]的基础上扩展当下点的标记半径。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
typedef long long ll;
int p[];
char a[];
int main()
{
while(cin>>a)
{
memset(p,,sizeof(p));
int len=strlen(a),id=,maxlen=;
for(int i=len;i>=;--i)
{
a[(i<<)+]='#';
a[(i<<)+]=a[i];
}
     a[0]='#';
for(int i=;i<*len-;i++)
{
if(p[id]+id>i) p[i]=min(p[id*-i],p[id]+id-i);
else p[i]=;
while(a[i-p[i]]==a[i+p[i]]) ++p[i];
if(id+p[id]<i+p[i])id=i;
if(maxlen<p[i])maxlen=p[i];
}
cout<<maxlen-<<endl;
}
return ;
}

hihocode上的这道题就很简单了http://hihocoder.com/problemset/problem/1032

最长回文子串 hihocode 1032 hdu 3068的更多相关文章

  1. hihoCoder第一周---最长回文子串(1032)

    其实这就是mancher算法的板子题,贴个代码好了. 思想请见我的另一篇博客: https://blog.csdn.net/qq_41090676/article/details/86768361 # ...

  2. 最长回文子串 —— Manacher (马拉车) 算法

    最长回文子串 回文串就是原串和反转字符串相同的字符串.比如 aba,acca.前一个是奇数长度的回文串,后一个是偶数长度的回文串. 最长回文子串就是一个字符串的所有子串中,是回文串且长度最长的子串. ...

  3. Manacher (马拉车) 算法:解决最长回文子串的利器

    最长回文子串 回文串就是原串和反转字符串相同的字符串.比如 aba,acca.前一个是奇数长度的回文串,后一个是偶数长度的回文串. 最长回文子串就是一个字符串的所有子串中,是回文串且长度最长的子串. ...

  4. hihocode #1032 : 最长回文子串【manacher】模板题

    题目链接:https://vjudge.net/problem/HihoCoder-1032 manacher算法详解:https://blog.csdn.net/dyx404514/article/ ...

  5. 最长回文子串(百度笔试题和hdu 3068)

    版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/17123559 求一个字符串的最长回文子串.注 ...

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

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

  7. hihocoder #1032 : 最长回文子串 Manacher算法

    题目链接: https://hihocoder.com/problemset/problem/1032?sid=868170 最长回文子串 时间限制:1000ms内存限制:64MB 问题描述 小Hi和 ...

  8. hihocoder #1032 : 最长回文子串【 manacher算法实现 】

    #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...

  9. hihoCoder #1032 : 最长回文子串 [ Manacher算法--O(n)回文子串算法 ]

    传送门 #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相 ...

随机推荐

  1. Qt之QToolButton

    简述 QToolButton类提供了用于命令或选项可以快速访问的按钮,通常可以用在QToolBar里面. 工具按钮和普通的命令按钮不同,通常不显示文本,而显示图标. 简述 详细描述 常用接口 更多参考 ...

  2. 我有一个idea,但是没有钱,又没技术怎么办?

    我想你还少讲一件事,就是同时如果你也没什么明确的商业计划,恭喜,那你有机会成为马云第二,因为他曾说过自己的成功要素就是「没钱」.「不懂技术」.「没有计划」,要是这么刚好让你从事互联网产业,我看不出三年 ...

  3. [Angular] Short Imports with TypeScript Path Mapping

    The idea is change from: import {CoreModule} from '../core/core.module'; to: import {CoreModule} fro ...

  4. Linux之我最常用的20条命令

    Linux之我最常用的20条命令 玩过 Linux的人都会知道, Linux中的命令的确是非常多,但是玩过 Linux的人也从来不会因为 Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的 ...

  5. php7-swoole-Class 'swoole_websocket_server' not found 问题

    标签(空格分隔): php 分析 nginx/apache 读取的php.uini 文件 和 cli模式的php.ini 文件不同导致的 swoole是在cli模式下运行的 或许你安装swoole扩展 ...

  6. java9新特性-11-String存储结构变更

    1. 官方Feature JEP254: Compact Strings 2. 产生背景 Motivation The current implementation of the String cla ...

  7. 关于Fragment的setUserVisibleHint() 方法和onCreateView()的执行顺序

    1:setUserVisibleHint(boolean isVisibleToUser)的方法就很重要,根据方法名来看当前页面是否可见, 里面的boolean值就是判断当前页面是否可见的变量,所以大 ...

  8. UVa 1151 Buy or Build【最小生成树】

    题意:给出n个点的坐标,现在需要让这n个点连通,可以直接在点与点之间连边,花费为两点之间欧几里得距离的平方,也可以选购套餐,套餐中所含的点是相互连通的 问最少的花费 首先想kruskal算法中,被加入 ...

  9. numa 和 mysql

    cpu numa结构反应的内存访问速度问题: 在多核cpu的时代引入了cpu的numa(非一致内存访问结构): NUMA引入了node的概念,每个物理CPU都被视作一个node,而每个node都有一个 ...

  10. python 爬虫简介

    初识Python爬虫 互联网 简单来说互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML.JS.CSS代码返回给浏览器,这些代码经过浏览器解析.渲染,将丰富多彩的网页呈现 ...