【GDOI2017模拟9.21】妮厨的愤怒

来源:互联网 发布:安卓游戏开发知乎 编辑:程序博客网 时间:2024/04/29 00:11

题目大意:

给出一个长度为n的字符串S,Q个询问,每次给出l,r,求S的第l位到第r位的最长回文子串。
(1<=n,Q<=10^5)

题解:

记得以前做过一道很像的题。
是YJL的题,二维RMQ,对于每一个查询也是二分答案。

不说了,首先添加特殊字符,manacher求出r。
对于每一个询问,二分答案,于是我们得到了可能的回文中心的范围,RMQ查询区间最大值,判一下即可。

Code:

#include<cmath>#include<cstdio>#include<cstring>#define fo(i, x, y) for(int i = x; i <= y; i ++) #define fd(i, x, y) for(int i = x; i >= y; i --)#define min(a, b) ((a) < (b) ? (a) : (b))#define max(a, b) ((a) > (b) ? (a) : (b))using namespace std;const int N = 100005, M = 17;char s[N * 2]; int r[N * 2];int n, Q, x, y, f[M + 1][N * 2], a2[M + 1];void Init() {    a2[0] = 1; fo(i, 1, M) a2[i] = a2[i - 1] * 2;    scanf("%d", &n); scanf("%s", s + 1);    fd(i, n, 1) s[i * 2] = s[i];    fo(i, 1, n) s[i * 2 - 1] = '@'; s[2 * n + 1] = '@';    n = 2 * n + 1;}void Build() {    int mx = 0, p = 0;    fo(i, 1, n) {        r[i] = mx >= i ? min(mx - i + 1, r[2 * p - i]) : 1;        while(i != r[i] && s[i - r[i]] == s[i + r[i]]) r[i] ++;        if(i + r[i] - 1 > mx) mx = i + r[i] - 1, p = i;    }}void Build_b() {    fo(i, 1, n) f[0][i] = r[i];    fo(i, 1, M) fo(j, 1, n) f[i][j] = max(f[i - 1][j], f[i - 1][min(j + a2[i - 1], n)]);}int Max(int x, int y) {    int l = log2(y - x + 1);    return max(f[l][x], f[l][y - a2[l] + 1]);}void End() {    for(scanf("%d", &Q); Q; Q --)    {        scanf("%d %d", &x, &y); x ++; y ++;        x = x * 2 - 1; y = y * 2 + 1;        int ans = 0;        for(int l = 1, r = (y - x) / 2 + 1; l <= r; ) {            int m = (l + r) / 2;            if(Max(x + m - 1, y - m + 1) >= m)                ans = m, l = m + 1; else r = m - 1;        }        printf("%d\n", ans - 1);    }}int main() {    Init();    Build();    Build_b();    End();}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 请事假公司不批怎么办 请病假领导不批怎么办 农民被当官的整怎么办 领英人脉圈以外怎么办 收到领英的短信怎么办 狗半夜叫个不停怎么办 如果被鬼上身了怎么办 支付宝借钱不还怎么办 鞋子里鞋垫老跑怎么办 鞋垫在鞋里老串怎么办 网贷已经借不到怎么办 骨龄比实际年龄大怎么办 小孩崴脚了肿了怎么办 报到证过期2年多怎么办 报到证过了期限怎么办 报到证超过两年怎么办 报到证过期4年了怎么办 学校没发报到证怎么办 未报到证过期了怎么办 专升本的报到证怎么办 蓝色报到证丢了怎么办 报到证用过了怎么办 大学报到证丢了怎么办 qq好被冻结了怎么办啊 qq突然被冻结了怎么办 扣扣密码被冻结怎么办 蠕动泵不抽水了怎么办 失眠多梦压力大怎么办 大福的皮硬了怎么办 安卓手机root失败怎么办 你的手机已root怎么办 移动网不能看片怎么办 网站的密码忘了怎么办 拍拍贷换手机了怎么办 六个半月的宝宝发烧怎么办 5个月的小孩发烧怎么办 3个月小孩发烧怎么办 2岁宝宝感冒发烧怎么办 2岁宝宝发烧38度怎么办 2岁宝宝反复发烧怎么办 八个月的孩子发烧怎么办