题目

求区间最长回文串长度

\(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);
}
}

最新文章

  1. Android数据存储之SharedPreferences及如何安全存储
  2. 从零开始学Python08作业源码:开发简单的FTP(仅供参考)
  3. ADO.NET操作数据库(一)
  4. android 检测网络是否连接,或者GPS是否可用
  5. java三篇博客转载 详解-vector,stack,queue,deque
  6. html部分---样式属性;
  7. 用户不在sudoers文件中的解决方法
  8. myeclipse自带客户端连接mysql数据库
  9. JS中判断JSON数据是否存在某字段的方法 JavaScript中判断json中是否有某个字段
  10. MVCmoduleExample.html
  11. AsciiMorph - 新奇的 ASCII 字符画生成工具&amp;插件
  12. cocos2d-x 开发用到的工具
  13. 基金 、 社保和QFII等机构的重仓股排名评测
  14. Hive和并行数据仓库的比较
  15. Java11-java基础语法(十)类设计综合案例
  16. Python学习1 基础数据类型
  17. Code Chef April Cook-Off 2019题解
  18. 算法笔记_214:第六届蓝桥杯软件类校赛真题(Java语言A组)
  19. Ubuntu14.04 64位机上安装OpenCV2.4.13(CUDA8.0)版操作步骤
  20. 图像bayer格式介绍以及bayer插值原理CFA

热门文章

  1. 2023年 DevOps 七大趋势
  2. Google Chrome(谷歌浏览器)安装使用
  3. 【数据库】PostgreSQL/PgSql-根据模式名和字段名查询有该字段的所有表信息【通过表元数据信息和函数实现】
  4. 【CDH数仓】Day02:业务数仓搭建、Kerberos安全认证+Sentry权限管理、集群性能测试及资源管理、邮件报警、数据备份、节点添加删除、CDH的卸载
  5. &lt;三&gt;function函数对象类型的应用示例
  6. 手把手教你玩转 Excel 数据透视表
  7. [seaborn] seaborn学习笔记6-热图HEATMAPPLOT
  8. 【ASP.NET Core】按用户等级授权
  9. mac下 idea 注释快捷键冲突
  10. Maui Blazor 使用摄像头实现