AcWing:139. 回文子串的最大长度(字符串Hash + 前缀和 + 后缀和 + 二分)
如果一个字符串正着读和倒着读是一样的,则称它是回文的。
给定一个长度为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 + 前缀和 + 后缀和 + 二分)的更多相关文章
- AcWing 139. 回文子串的最大长度 hash打卡
如果一个字符串正着读和倒着读是一样的,则称它是回文的. 给定一个长度为N的字符串S,求他的最长回文子串的长度是多少. 输入格式 输入将包含最多30个测试用例,每个测试用例占一行,以最多1000000个 ...
- 139. 回文子串的最大长度(回文树/二分,前缀,后缀和,Hash)
题目链接 : https://www.acwing.com/problem/content/141/ #include <bits/stdc++.h> using namespace st ...
- 【题解】回文串 APIO 2014 BZOJ 3676 COGS 1985 Manacher+后缀数组+二分
这题可以用回文自动机来做,但是我并没有学,于是用Manacher+SA的做法O(nlogn)水过 首先,看到回文串就能想到用Manacher 同样还是要利用Manacher能不重复不遗漏地枚举每个回文 ...
- lintcode最长回文子串(Manacher算法)
题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...
- 后缀数组 - 求最长回文子串 + 模板题 --- ural 1297
1297. Palindrome Time Limit: 1.0 secondMemory Limit: 16 MB The “U.S. Robots” HQ has just received a ...
- lintcode :Longest Palindromic Substring 最长回文子串
题目 最长回文子串 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 样例 给出字符串 "abcdzdcab",它的最长回文 ...
- 计算字符串的最长回文子串 :Manacher算法介绍
转自: http://www.open-open.com/lib/view/open1419150233417.html Manacher算法 在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简 ...
- HDU 1544 Palindromes(回文子串)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1544 问题分析: 问题要求求出字符串的连续子串中的回文子串个数.首先,需要区分连续子串与子序列的区别. ...
- C-最长回文子串(1)
最长回文子串,就是在字符串中找到最长的对称的子串. s是一个字符串. int max = 0; for(i = 0;i<m;i++) for(j = i;j<m;j++) if(s[i.. ...
随机推荐
- 从入门到自闭之Python自定义模块
自定义模块 定义:一个文件就是一个模块(能被调用的文件,模块就是一个工具箱,工具就是函数) 作用: 将代码文家化管理,提高可读性,避免重复代码 拿来就用(避免重复造轮子),python中类库比较多,提 ...
- 删除链表中重复的结点——牛客剑指offer
题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理 ...
- 【原创】大叔经验分享(55)spark连接kudu报错
spark-2.4.2kudu-1.7.0 开始尝试 1)自己手工将jar加到classpath spark-2.4.2-bin-hadoop2.6+kudu-spark2_2.11-1.7.0-cd ...
- wepy 使用filter过滤器
作为过滤器,filter的好处不言而喻,使用过vue的雄蝶内心乐开了花 那么在wepy中,遇到需要计算的数据,要如何使用filter去处理呢 新建.wxs文件 文件名称.位置自己看着来,当然能够一目了 ...
- docker删除虚悬镜像(临时镜像文件)
在我们构建镜像的过程中,常常需要使用build命令根据Dockerfile进行构建镜像,并且会build很多次,镜像名字也是相同的,那么就会出来下面这种情况
- 在iPhone开发中实现解压缩gzip
在iPhone开发中实现解压缩gzip是本文要介绍的内容,最近做的一个东西中,需要从网络获取xml文件,但是该文件用了gzip压缩的.搜索一 下有人说gzip压缩的用urlrequest可以自己解压, ...
- ab测试工具的使用
下载地址:http://httpd.apache.org/download.cgi#apache24 编译安装后在安装目录bin下可以找到ab执行程序 基本用法: ab -n 5000 -c 1000 ...
- Delphi 子界类型
- c++ 初学者的画图库EasyX
EasyX 什么是easyx? EasyX 是针对 C++ 的图形库,可以帮助 C++语言初学者快速上手图形和游戏编程.其实就是c++的一个图形库让初学者不用只在控制台输出代码,而是在图形界面进行开发 ...
- shell cat EOF 变量自动解析问题
使用如下shell安装node时,一直提示 command not found wget https://mirrors.huaweicloud.com/nodejs/latest-v8.x/node ...