如果一个字符串正着读和倒着读是一样的,则称它是回文的。

给定一个长度为N的字符串S,求他的最长回文子串的长度是多少。

输入格式

输入将包含最多30个测试用例,每个测试用例占一行,以最多1000000个小写字符的形式给出。

输入以一个以字符串“END”(不包括引号)开头的行表示输入终止。

输出格式

对于输入中的每个测试用例,输出测试用例编号和最大回文子串的长度(参考样例格式)。

每个输出占一行。

输入样例:

abcbabcbabcba
abacacbaaaab
END

输出样例:

Case 1: 13
Case 2: 6

算法: 字符串Hash + 前缀和 + 后缀和 + 二分

注意:其中的二分mid的取值是 (l + r + 1) >> 1,这个是有含义的,我之前写了一些博客,可供参考 ——> https://www.cnblogs.com/buhuiflydepig/p/11291541.html

#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; typedef long long ll; const int maxn = 1e6+;
const int P = ; ll prefix[maxn], suffix[maxn]; //前后缀和
char str[maxn];
ll p[maxn]; void init() {
p[] = ;
for(int i = ; i <= ; i++) {
p[i] = p[i - ] * P; //P进制的值位
}
} void setFix(char *s) {
int len = strlen(s + );
prefix[] = suffix[len + ] = ; //注意,这里需要初始话
for(int i = ; i <= len; i++) {
prefix[i] = prefix[i - ] * P + s[i] - 'a' + ;
}
for(int i = len; i >= ; i--) {
suffix[i] = suffix[i + ] * P + s[i] - 'a' + ;
}
} ll Hash1(int l, int r, ll *arr) { //前缀和计算区间的Hash值
return arr[r] - arr[l - ] * p[r - l + ];
} ll Hash2(int l, int r, ll *arr) { //后缀和计算区间的Hash值
return arr[l] - arr[r + ] * p[r - l + ];
} int main() {
init();
int cas = ;
while(true) {
scanf("%s", str + );
if(strcmp(str + , "END") == ) {
break;
}
setFix(str);
int ans = ;
int len = strlen(str + );
for(int i = ; i <= len; i++) {
int l = , r = min(i - , len - i);
while(l < r) {
int mid =(l + r + ) >> ; //二分长度,以i为中间点
if(Hash1(i - mid, i - , prefix) == Hash2(i + , i + mid, suffix)) {
l = mid;
} else {
r = mid - ;
} }
ans = max(ans, l << | ); //第一个二分的是奇数的回文串,所以这里需要加一
l = , r = min(i - , len - i + ); //这里包括i
while(l < r) {
int mid = (l + r + ) >> ;
if(Hash1(i - mid, i - , prefix) == Hash2(i, i + mid - , suffix)) {
l = mid;
} else {
r = mid - ;
}
}
ans = max(ans, l << ); //这里是偶数的回文串
}
printf("Case %d: %d\n", ++cas, ans);
}
return ;
}

AcWing:139. 回文子串的最大长度(字符串Hash + 前缀和 + 后缀和 + 二分)的更多相关文章

  1. AcWing 139. 回文子串的最大长度 hash打卡

    如果一个字符串正着读和倒着读是一样的,则称它是回文的. 给定一个长度为N的字符串S,求他的最长回文子串的长度是多少. 输入格式 输入将包含最多30个测试用例,每个测试用例占一行,以最多1000000个 ...

  2. 139. 回文子串的最大长度(回文树/二分,前缀,后缀和,Hash)

    题目链接 : https://www.acwing.com/problem/content/141/ #include <bits/stdc++.h> using namespace st ...

  3. 【题解】回文串 APIO 2014 BZOJ 3676 COGS 1985 Manacher+后缀数组+二分

    这题可以用回文自动机来做,但是我并没有学,于是用Manacher+SA的做法O(nlogn)水过 首先,看到回文串就能想到用Manacher 同样还是要利用Manacher能不重复不遗漏地枚举每个回文 ...

  4. lintcode最长回文子串(Manacher算法)

    题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...

  5. 后缀数组 - 求最长回文子串 + 模板题 --- ural 1297

    1297. Palindrome Time Limit: 1.0 secondMemory Limit: 16 MB The “U.S. Robots” HQ has just received a ...

  6. lintcode :Longest Palindromic Substring 最长回文子串

    题目 最长回文子串 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 样例 给出字符串 "abcdzdcab",它的最长回文 ...

  7. 计算字符串的最长回文子串 :Manacher算法介绍

    转自: http://www.open-open.com/lib/view/open1419150233417.html Manacher算法 在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简 ...

  8. HDU 1544 Palindromes(回文子串)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1544 问题分析: 问题要求求出字符串的连续子串中的回文子串个数.首先,需要区分连续子串与子序列的区别. ...

  9. C-最长回文子串(1)

    最长回文子串,就是在字符串中找到最长的对称的子串. s是一个字符串. int max = 0; for(i = 0;i<m;i++) for(j = i;j<m;j++) if(s[i.. ...

随机推荐

  1. 2-SAT问题介绍求解 + 模板题P4782

    (点击此处查看原题) 什么是2-SAT问题 sat 即 Satisfiability,意思为可满足,那么2-SAT表示一些布尔变量只能取true或者false,而某两个变量之间的值存在一定的关系(如: ...

  2. APP_测试流程(测试点)

    1 APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间. 1.3测试资 ...

  3. VUE(下)

    VUE(下) VUE指令 表单指令 数据的双向指令 v-model = "变量" model绑定的变量,控制的是表单元素的value值 普通表单元素用v-model直接绑定控制va ...

  4. redis 单线程的理解

    单线程模型 Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程.其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会 ...

  5. P3586 [POI2015]LOG

    传送门 对于询问,首先如果正数数量不到 $c$ 个显然无解 然后如果大于等于 $s$ 的数大于等于 $c$ 个,那么显然有解 否则,考虑贪心地取数,首先初始大于等于 $s$ 的哪些数我们每次取都可以取 ...

  6. java实现的LinkedLilst

    package javabean.adt.List; import java.util.ConcurrentModificationException; import java.util.Iterat ...

  7. @RequestMapping-标准映射和Ant风格的映射

    4.@RequestMapping 如果value不以“/”开头,SpringMVC会自动添加“/” 4.1.@RequestMapping映射 4.1.1.标准URL映射 4.1.2.Ant风格的U ...

  8. luogu题解 P1462 【通往奥格瑞玛的道路】二分+spfa

    题目链接: https://www.luogu.org/problemnew/show/P1462 思路: 又是一道水题,很明显二分+最短路 而且这道题数据非常水,spfa有个小错误居然拿了91分还比 ...

  9. 102、如何滚动更新 Service (Swarm09)

    参考https://www.cnblogs.com/CloudMan6/p/7988455.html   在前面的实验中,我们部署了多个副本的服务,本节将讨论如何滚动更新每一个副本.   滚动更新降低 ...

  10. 防sql注入方法

    mysql_escape_string(strip_tags($arr)) /** * 函数名称:post_check() * 函数作用:对提交的编辑内容进行处理 * 参 数:$post: 要提交的内 ...