JZOJ 2483. 【GDKOI 2021提高组DAY1】回文(palindrome)
2024-10-21 04:05:08
题目
求区间最长回文串长度
\(1 \le n\le 5 \times 10^5\)
题解
比较妙的做法,主要是在询问部分
预处理出以某位为中心回文半径长 \(p_i\),马拉车和二分+哈希均可
然后考虑询问区间 \([l..r]\)
二分一个答案半径,\(\text st\) 表维护 \([l_{new}+mid-1,r_{new}-mid+1]\) 的 \(p\) 的最大值
于是就成了判定问题
\(Code\)
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N = 5e5 + 5;
int n, q, p[N << 1], lg[N << 1], f[N << 1][22];
char s[N], str[N << 1];
inline void read(int &x)
{
x = 0; int f = 1; char ch = getchar();
while (ch < '0' || ch > '9') f = (ch == '-' ? -1 : f), ch = getchar();
while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
x *= f;
}
inline void manacher()
{
str[0] = '@', str[1] = '#', n = 2;
int len = strlen(s);
for(register int i = 0; i < len; i++) str[n++] = s[i], str[n++] = '#';
str[n] = '\0';
int mx = 0, id = 0;
for(register int i = 1; i <= n; i++)
{
p[i] = (i < mx ? min(p[2 * id - i], mx - i) : 1);
while (str[i + p[i]] == str[i - p[i]]) ++p[i];
if (i + p[i] > mx) mx = i + p[i], id = i;
}
}
inline int query(int i, int j)
{
if (i > j) return 0;
int k = lg[j - i + 1];
return max(f[i][k], f[j - (1 << k) + 1][k]);
}
inline void st_table()
{
for(register int i = 1; i <= n; i++) f[i][0] = p[i];
for(register int i = 2; i <= n; i++) lg[i] = lg[i - 1] + ((1 << (lg[i - 1] + 1)) == i ? 1 : 0);
for(register int j = 1; j <= lg[n]; j++)
for(register int i = 1; i + (1 << j) - 1 <= n; i++)
f[i][j] = max(f[i][j - 1], f[i + (1 << j - 1)][j - 1]);
}
int main()
{
freopen("palindrome.in", "r", stdin);
freopen("palindrome.out", "w", stdout);
scanf("%s%d", s, &q);
manacher(), st_table();
for(int l, r; q; --q)
{
read(l), read(r), l = (l << 1) - 1, r = (r << 1) + 1;
int ans = 1, L = 2, R = r - l + 1, mid;
while (L <= R)
{
mid = (L + R) >> 1;
if (query(l + mid - 1, r - mid + 1) >= mid) ans = mid, L = mid + 1;
else R = mid - 1;
}
printf("%d\n", ans - 1);
}
}
最新文章
- Android数据存储之SharedPreferences及如何安全存储
- 从零开始学Python08作业源码:开发简单的FTP(仅供参考)
- ADO.NET操作数据库(一)
- android 检测网络是否连接,或者GPS是否可用
- java三篇博客转载 详解-vector,stack,queue,deque
- html部分---样式属性;
- 用户不在sudoers文件中的解决方法
- myeclipse自带客户端连接mysql数据库
- JS中判断JSON数据是否存在某字段的方法 JavaScript中判断json中是否有某个字段
- MVCmoduleExample.html
- AsciiMorph - 新奇的 ASCII 字符画生成工具&;插件
- cocos2d-x 开发用到的工具
- 基金 、 社保和QFII等机构的重仓股排名评测
- Hive和并行数据仓库的比较
- Java11-java基础语法(十)类设计综合案例
- Python学习1 基础数据类型
- Code Chef April Cook-Off 2019题解
- 算法笔记_214:第六届蓝桥杯软件类校赛真题(Java语言A组)
- Ubuntu14.04 64位机上安装OpenCV2.4.13(CUDA8.0)版操作步骤
- 图像bayer格式介绍以及bayer插值原理CFA
热门文章
- 2023年 DevOps 七大趋势
- Google Chrome(谷歌浏览器)安装使用
- 【数据库】PostgreSQL/PgSql-根据模式名和字段名查询有该字段的所有表信息【通过表元数据信息和函数实现】
- 【CDH数仓】Day02:业务数仓搭建、Kerberos安全认证+Sentry权限管理、集群性能测试及资源管理、邮件报警、数据备份、节点添加删除、CDH的卸载
- <;三>;function函数对象类型的应用示例
- 手把手教你玩转 Excel 数据透视表
- [seaborn] seaborn学习笔记6-热图HEATMAPPLOT
- 【ASP.NET Core】按用户等级授权
- mac下 idea 注释快捷键冲突
- Maui Blazor 使用摄像头实现