URAL

来源:互联网 发布:淘宝达人开通 编辑:程序博客网 时间:2024/06/10 11:59

题意:判断是否为回文串

思路:两颗线段树存一段字符串的正向哈希值和反向哈希值,具体思路看别的博客吧,我query函数忘记改ull错了13遍已经没脸见人了。。。

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef unsigned long long ull;const int maxn = 1e5 + 10;const int k = 123;char str[maxn], op[100];int n;ull p[maxn], date[maxn], segTree[2][maxn<<2];void pushup(int root, int flag) {    segTree[flag][root] = segTree[flag][root<<1] + segTree[flag][root<<1|1];}void build(int L, int R, int root, int flag) {    if (L == R) {        segTree[flag][root] = date[L];        return;    }    int mid = (L + R)>>1;    build(L, mid, root<<1, flag);    build(mid + 1, R, root<<1|1, flag);    pushup(root, flag);}void update_node(int L, int R, int root, int pos, ull val, int flag) {    if (L == R) {        segTree[flag][root] = val;        return;    }    int mid = (L + R)>>1;    if (pos <= mid) {        update_node(L, mid, root<<1, pos, val, flag);    }    else {        update_node(mid + 1, R, root<<1|1, pos, val, flag);    }    pushup(root, flag);}ull query(int L, int R, int root, int qL, int qR, int flag) {    if (qL <= L && R <= qR) {        return segTree[flag][root];    }    int mid = (L + R)>>1;    ull temp = 0;    if (qL <= mid) {        temp += query(L, mid, root<<1, qL, qR, flag);    }    if (qR > mid) {        temp += query(mid + 1, R, root<<1|1, qL, qR, flag);    }    return temp;}int main(){    while (scanf("%s", str) != EOF) {        n = strlen(str);        for (int i = 0; i <= n * 4; i++) {            segTree[0][i] = segTree[1][i] = 0;        }        p[0] = 1;        for (int i = 1; i <= n; i++) {            p[i] = p[i - 1] * k;        }        for (int i = 0; i < n; i++) {            date[i + 1] = p[i] * (ull)str[i];        }        build(1, n, 1, 0);        reverse(str, str + n);        for (int i = 0; i < n; i++) {            date[i + 1] = p[i] * (ull)str[i];        }        build(1, n, 1, 1);        int q; scanf("%d", &q);        while (q--) {            scanf("%s", op);            if (op[0] == 'p') {                int a, b; scanf("%d %d", &a, &b);                if (a > b) {                    int t = a; a = b; b = t;                }                ull temp1 = query(1, n, 1, a, b, 0);                ull temp2 = query(1, n, 1, n - b + 1, n - a + 1, 1);                int t1 = a - 1, t2 = n - b;                if (t1 < t2) temp1 *= p[t2 - t1];                else temp2 *= p[t1 - t2];                if (temp1 == temp2) {                    printf("Yes\n");                }                else {                    printf("No\n");                }            }            else {                int a; char b; scanf("%d %c", &a, &b);                update_node(1, n, 1, a, p[a - 1] * (ull)b, 0);                update_node(1, n, 1, n - a + 1, p[n - a] * (ull)b, 1);            }        }    }    return 0;}


原创粉丝点击