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
- ACdream 1019 Palindrome 树状数组+Hash
- Acdream 1019 Palindrome 树状数组 + 字符串hash
- hdu3333(hash+树状数组)
- 【树状数组】 ACdream 1127 Base Station
- 【ACDream】1127 Base Station 树状数组
- acdream群赛(树状数组,Trie树)
- acdream 1127 Base Station 树状数组
- ACdream 1127(Base Station-树状数组-2个约束条件)
- ACdream 1055 Crayon (离散化+树状数组)
- [hdu 6230 Palindrome] Manacher+树状数组
- POJ2299 Ultra-QuickSort 【树状数组】+【hash】
- ural 1989(树状数组+多项式hash)
- HDU 4456 Crowd (二维树状数组 + HASH)
- bzoj 2124 神奇的树状数组+hash
- BZOJ 2124 树状数组+Hash 解题报告
- (CDOJ) UESTC 606 Palindrome Again 后缀数组二分 + Manacher + Hash
- 2017CCPC哈尔滨 A:Palindrome(manacher+树状数组)
- ccpc哈尔滨A [HDU-6230] Palindrome Manacher+树状数组
- iOS开发学习之地图demo
- 批量修改AOT元素的属性 待续。。。
- openGL基础知识
- 【读后感】读《编程ING,人人都能学会程序设计》
- 当幸福来敲门
- ACdream 1019 Palindrome 树状数组+Hash
- win7旗舰版(64位)环境下oracle11g的安装方法
- 惠普实训第一阶段总结,java项目总结,第二阶段计划
- 怎样不使用Useradd在linux下创建一个新的用户
- 扬帆起航
- 2015 Autumn Training #0
- win10下硬盘安装(更新)win10
- NW.js的简单使用
- 【凸包直径&平面最远点对&对锺点(旋转卡壳)】poj 2187 Beauty Contest