ACdream 1019 Palindrome 树状数组+Hash

来源:互联网 发布:linux 锁机制 编辑:程序博客网 时间:2024/05/17 08:47

题目大意:

就是现在给出一个长度不超过100万的字符串, 有两种操作, 修改某个位置的字符, 询问 [L, R] 这个部分的字串是否是回文串


大致思路:

这个题刚开始用线段树写了一发发现MLE...

然后就换树状数组了...不知道zkw线段树能不能行

首先对于这个串按照原来的顺序和倒序分别建立树状数组, 保存每个字符对应在全部的串中对应的哈希值

然后树状数组查询区间和, 修改的时候单点修改即可

整体复杂度O((n + Q)logn)

n表示字符串长度


代码如下:

Result  :  Accepted     Memory  :  26092 KB     Time  :  1184 ms

/* * Author: Gatevin * Created Time:  2015/10/1 20:52:40 * File Name: A.cpp */#include<iostream>#include<sstream>#include<fstream>#include<vector>#include<list>#include<deque>#include<queue>#include<stack>#include<map>#include<set>#include<bitset>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<cctype>#include<cmath>#include<ctime>#include<iomanip>using namespace std;const double eps(1e-8);typedef long long lint;typedef unsigned long long ulint;#define maxn 1000010ulint seed = 23333uLL;ulint xp[maxn];struct BIT{    ulint c[maxn], N;    inline int lowbit(int x)    {        return -x & x;    }    void add(int x, ulint val)    {        while(x <= N) c[x] += val, x += lowbit(x);    }    ulint sum(int x)    {        ulint ret = 0;        while(x) ret += c[x], x -= lowbit(x);        return ret;    }    void clear()    {        memset(c, 0, sizeof(c));    }};BIT bit1, bit2;char s[maxn];int len;bool check(int l, int r){    ulint val1 = bit1.sum(r) - bit1.sum(l - 1);    ulint val2 = bit2.sum(len + 1 - l) - bit2.sum(len + 1 - r - 1);    if(l < len + 1 - r) val2 *= xp[len + 1 - r - l];    else val1 *= xp[l - (len + 1 - r)];    return val1 == val2;}int main(){    xp[0] = 1uLL;    for(int i = 1; i <= 1000000; i++) xp[i] = xp[i - 1]*seed;    while(scanf("%s", s + 1) != EOF)    {        len = strlen(s + 1);        bit1.clear(); bit2.clear();        bit1.N = bit2.N = len;        for(int i = 1; i <= len; i++)        {            bit1.add(i, (s[i] - 'a' + 1)*xp[len - i]);            bit2.add(i, (s[len + 1 - i] - 'a' + 1)*xp[len - i]);        }        int Q;        scanf("%d", &Q);        char op[4];        while(Q--)        {            scanf("%s", op);            if(op[0] == 'Q')            {                int l, r;                scanf("%d %d", &l, &r);                if(check(l, r)) puts("yes");                else puts("no");            }            else            {                int pos;                char c;                scanf("%d %c", &pos, &c);                bit1.add(pos, (c - s[pos])*xp[len - pos]);                bit2.add(len + 1 - pos, (c - s[pos])*xp[len - (len + 1 - pos)]);                s[pos] = c;            }        }    }    return 0;}/*aaaaa4Q 1 5C 2 bQ 1 5Q 1 3*/


0 0
原创粉丝点击