GDKOI 2021 提高组 Day1 第三题 回文
题目大意
- 给出长为 n n n的串,和 q q q组询问,每次询问区间中的最长回文串。
- n , q ≤ 5 ∗ 1 0 5 n,q\le5*10^5 n,q≤5∗105
题解
- 可以先用manachar求出以每个位置为中心的回文串,询问时二分答案,然后在区间中判断是否存在长度为 m i d mid mid的回文串,用ST表维护区间最值。
- 注意二分判断时并非在整个区间 [ l , r ] [l,r] [l,r]中找最大值,而需分别将左端点右移和右端点左移大约 m i d mid mid(因奇偶而不同)的位置,以保证找到的回文串整段落在区间内。
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define N 500010
#define ll long long
#define md 998244353
char a[N];
int n, Q, o;
int s0[N], s1[N], F0[N][20], F1[N][20], G0[N][20], G1[N][20];
float lo[N];
int find0(int l, int r) {
if(l > r) return 0;
o = floor(lo[r - l + 1] / lo[2]);
return max(F0