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.. ...
随机推荐
- PreparedStatement 以及事务的注意事项
a).PreparedStatement 可以进行批量操作,但是与Statement有一定的区别 1. Statement可以进行不同sql语句的批量操作 即可以同时进行 crud 操作. Strin ...
- n=C(2,n)+k(构造)( Print a 1337-string)Educational Codeforces Round 70 (Rated for Div. 2)
题目链接:https://codeforc.es/contest/1202/problem/D 题意: 给你一个数 n ( <=1e9 ),让你构造137713713.....(只含有1,3,7 ...
- python-redis缓存-pool
#连接池 import redis pool=redis.ConnectionPool(host='192.168.71.140', port=6379) r = redis.Redis(connec ...
- Two strings CodeForces - 762C (字符串,双指针)
大意: 给定字符串$a$,$b$, $b$可以任选一段连续的区间删除, 要求最后$b$是$a$的子序列, 求最少删除区间长度. 删除一段连续区间, 那么剩余的一定是一段前缀和后缀. 判断是否是子序列可 ...
- hadoop批量命令脚本xcall.sh及jps找不到命令解决
1.xcall.sh批量命令脚本: #!/bin/bash params=$@ i=128 for (( i=128 ; i <= 131 ; i = $i + 1 )) ; do echo = ...
- Communication between C++ and Javascript in Qt WebEngine(转载)
Communication between C++ and Javascript in Qt WebEngine admin January 31, 2018 0 As Qt WebKit is re ...
- php enum 数字类型插入失败的解决办法
今天遇到一个问题,我设置mysql字段 existence 为enum ,值为 ''0','1'. 当使用 php 进行查找 where existence = 1 的时候,并没有查询出什么数据. 后 ...
- PostgreSQL 按照日期范围查询
method 1 select * from user_info where create_date >= '2019-05-01' and create_date < '2019-08- ...
- ABAP常用函数归纳
转至:http://blog.csdn.net/forever_crazy/article/details/17707745 获取当前逻辑系统标识:OWN_LOGICAL_SYSTEM_GET 一.日 ...
- python异步IO编程(二)
python异步IO编程(二) 目录 开门见山 Async IO设计模式 事件循环 asyncio 中的其他顶层函数 开门见山 下面我们用两个简单的例子来让你对异步IO有所了解 import asyn ...