在这里采用的是哈希+二分的方法。

根据回文串的性质可知,可以将回文分成奇回文和偶回文分别进行处理。

对于奇回文来说,每次枚举的端点一定是重合的,因此只需计算出端点左右公共的长度是多少即可,因此二分的是以该枚举点为中心的左半边共有多少个字符。

对于偶回文来说,每次枚举的端点不一定是相等的,因此在二分的是以当前枚举点开始(包括当前枚举点)向右最多有多少个字符。

另外,之所以能够采用二分是因为当前需判断的左右串是否是回文这个问题具有单调性,即:从最大点处开始之后均不是回文,小于最大值均是回文。

在比较左右是否相等时,用字符串哈希在常数时间内比较即可。

代码如下:

#include <cstdio>
#include <cstring>
#include <memory.h>
#include <algorithm>
using namespace std;
const int maxn=1e6+10;
const int b=131; char s[maxn];
int n,kase;
unsigned long long p[maxn],h1[maxn],h2[maxn]; #define cls(a,b) memset(a,b,sizeof(a)) void init(){
cls(p,0);cls(h1,0);cls(h2,0);
} void read_and_parse(){
n=strlen(s+1);
p[0]=1;
for(int i=1;i<=n;i++){
p[i]=p[i-1]*b;
h1[i]=h1[i-1]*b+s[i]-'a';
}
for(int i=n;i>=1;i--)h2[i]=h2[i+1]*b+s[i]-'a';
} unsigned long long get1(int l,int r){
return h1[r]-h1[l-1]*p[r-l+1];
}
unsigned long long get2(int l,int r){
return h2[l]-h2[r+1]*p[r-l+1];
} void solve(){
int ans=1;
for(int i=1;i<=n;i++){
int l=0,r=min(i-1,n-i);
while(l<r){
int mid=l+r+1>>1;
if(get1(i-mid,i)==get2(i,i+mid))l=mid;
else r=mid-1;
}
ans=max(ans,l<<1|1);
}
for(int i=1;i<=n;i++){
int l=0,r=min(i-1,n-i+1);
while(l<r){
int mid=l+r+1>>1;
if(get1(i-mid,i-1)==get2(i,i+mid-1))l=mid;
else r=mid-1;
}
ans=max(ans,r<<1);
}
printf("Case %d: %d\n",++kase,ans);
} int main(){
while(scanf("%s",s+1)&&s[1]!='E'){
init();
read_and_parse();
solve();
}
return 0;
}

【POJ3974】最长回文字串的更多相关文章

  1. 求字符串的最长回文字串 O(n)

    昨天参加了某公司的校园招聘的笔试题,做得惨不忍睹,其中就有这么一道算法设计题:求一个字符串的最长回文字串.我在ACM校队选拔赛上遇到过这道题,当时用的后缀数组AC的,但是模板忘了没写出代码来. 回头我 ...

  2. hihocoder 第一周 最长回文字串

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

  3. POJ 3974 最长回文字串(manacher算法)

    题意:给出一个字符串,求出最长回文字串. 思路:一开始我直接上了后缀数组DC3的解法,然后MLE了.看了DISCUSS发现还有一种计算回文字串更加优越的算法,就是manacher算法.就去学习了一下, ...

  4. 最长回文字串——manacher算法

    时间复杂度:O(n) 参考:https://segmentfault.com/a/1190000003914228 1.问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 如果一个字 ...

  5. Hdu 3068 最长回文字串Manacher算法

    题目链接 最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. 最长回文字串 (The longest palindrome substring)

    这两天去学了一下,觉得下面那篇文章写的很好,有例子,比较容易懂,所以转一下. 以下内容来自:hihoCoder: 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互 ...

  7. Leetcode5.Longest Palindromic Substring最长回文字串

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...

  8. 【LeetCode每天一题】Longest Palindromic Substring(最长回文字串)

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  9. HihoCoder第一周与POJ3974:最长回文字串

    这个题目是hihoCoder第一周的题目,自己打算从第一周开始做起,不知道能追上多少,更不知道这一篇写完,下一篇会是什么时候... 题意很简单. 输入: abababa aaaabaa acacdas ...

随机推荐

  1. 1013 C. Photo of The Sky

    传送门 [http://codeforces.com/contest/1013/problem/C] 题意 输入一个n代表n颗星星,输入2n个数,其中任意两个数代表一颗行星的坐标,问你把n个星星围起来 ...

  2. java感想

    Java学起来很有趣,通过学习Java可以提高自己的逻辑能力.在学习Java期间我们做了一些程序,我们班的同学也都积极准备,完成的还不错!在做程序时,我遇到了一些难题,有时也会出现错误,时间长了弄得我 ...

  3. 软件工程(GZSD2015)学生博客列表

    2015年贵州师范大学软件工程课程学生博客列表 陈小丽 郑倩 唐洁 周娟 李利思 肖俊 罗文豪 周静 徐明艳 毛涛 邓洪虹 岳庆 李盼 安坤 何亚 涂江凤 张义平 杨明颢 杨家堂 胡贵玲 寿克霞 吴明 ...

  4. Laravel - 1

    Laravel - 1 Laravel是一个很强大又非常优雅的php框架,但是Laravel的很多组件都是由社区协作的结果,Composer是php开发的一个依赖管理工具,但是墙把绝大多数的开发者堵在 ...

  5. PAT 1081 检查密码

    https://pintia.cn/problem-sets/994805260223102976/problems/994805261217153024 本题要求你帮助某网站的用户注册模块写一个密码 ...

  6. CSS 范围选择器(自编)

    选择第一个到第六个li元素ul li:nth-child(n+3):not(:nth-child(n+6)){} 选择第二个到最后一个ul li:nth-child(2)~li{} 选择除了第一个和最 ...

  7. python2.7.x的字符串编码到底什么鬼?(中文和英文的处理)

    一直以来我其实一直对python的编码弄得非常晕,能正常编码,也能处理一些情况.但是始终不明白有些问题究竟为何出,原因是什么,为什么要这样用. 今天晚上正好好好研究了一番解答了自己心中的困惑. Q:p ...

  8. python之类的继承

    # 类的的操作实例 # 子类ECar继承父类Car,并将实例Battery用作属性 class Car(): def __init__(self, name, model, year): self.n ...

  9. bram和dram的区别

    http://blog.csdn.net/jbb0523/article/details/6533760

  10. mysql 常用命令导入导出修改root密码

    MySQL 忘记口令的解决办法如果 MySQL 正在运行,首先杀之: killall -TERM mysqld. 启动 MySQL :mysql --skip-grant-tables & / ...