这个操作十分的复杂

但是可以拿平衡树维护

直接二分答案然后用$hash$值判断即可

复杂度$O(10000 * log^2 n + n \log n)$

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define ri register int
#define ull unsigned long long
#define rep(io, st, ed) for(ri io = st; io <= ed; io ++)
#define drep(io, ed, st) for(ri io = ed; io >= st; io --)
#define gc getchar
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p * w;
} inline char gcr() {
char c = gc();
while() {
if(c >= 'a' && c <= 'z') return c;
if(c >= 'A' && c <= 'Z') return c;
c = gc();
}
} const int sid = ;
const int sed = ; char s[sid];
int n, m, rt, at, bt, ct, dt, id;
int sz[sid], ls[sid], rs[sid], pri[sid];
ull wei[sid], sum[sid], val[sid]; inline int rand() {
static int seed = ;
return seed = (1ll * seed * ) % ;
} inline int newnode(char v) {
++ id;
val[id] = v; sz[id] = ;
pri[id] = rand(); sum[id] = v;
return id;
} inline void upd(int o) {
sz[o] = sz[ls[o]] + sz[rs[o]] + ;
sum[o] = sum[ls[o]] + sum[rs[o]] * wei[sz[ls[o]] + ];
sum[o] += val[o] * wei[sz[ls[o]] + ];
} inline int merge(int x, int y) {
if(!x || !y) return x + y;
if(pri[x] > pri[y]) {
rs[x] = merge(rs[x], y);
upd(x); return x;
}
else {
ls[y] = merge(x, ls[y]);
upd(y); return y;
}
} inline void split(int o, int k, int &x, int &y) {
if(!o) { x = y = ; return; }
if(k <= sz[ls[o]]) y = o, split(ls[o], k, x, ls[o]);
else x = o, split(rs[o], k - sz[ls[o]] - , rs[o], y);
upd(o);
} inline ull getHash(int l, int r) {
split(rt, r, at, bt);
split(at, l - , ct, dt);
ull ret = sum[dt];
rt = merge(ct, merge(dt, bt));
return ret;
} inline bool check(int x, int y, int v) {
return getHash(x, x + v - ) == getHash(y, y + v - );
} int main() {
scanf("%s", s + );
n = strlen(s + ); wei[] = ;
rep(i, , ) wei[i] = wei[i - ] * sed;
rep(i, , n) rt = merge(rt, newnode(s[i])); m = read();
rep(i, , m) {
char c = gcr();
int x, y; char d;
if(c == 'Q') {
x = read(); y = read();
if(x > y) swap(x, y);
int l = , r = n - y + , ans = ;
while(l <= r) {
int mid = (l + r) >> ;
if(check(x, y, mid)) {
l = mid + , ans = mid;
printf("qaq -> %d\n", mid);
}
else r = mid - ;
}
printf("%d\n", ans);
}
else if(c == 'R') {
x = read(); d = gcr();
split(rt, x - , at, bt);
split(bt, , ct, dt);
rt = merge(at, merge(newnode(d), dt));
}
else if(c == 'I') {
n ++;
x = read(); d = gcr();
split(rt, x, at, bt);
rt = merge(at, merge(newnode(d), bt));
}
}
return ;
}

luoguP4036 [JSOI2008]火星人 平衡树+hash的更多相关文章

  1. BZOJ_1014_[JSOI2008]火星人prefix_splay+hash

    BZOJ_1014_[JSOI2008]火星人prefix_splay+hash 题意:火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam, 我们 ...

  2. bzoj 1014: [JSOI2008]火星人prefix hash && splay

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3154  Solved: 948[Submit][ ...

  3. BZOJ1014:[JSOI2008]火星人(Splay,hash)

    Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam, 我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 ...

  4. 2018.06.28 BZOJ1014 [JSOI2008]火星人prefix(非旋treap+hash)

    [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MB Submit: 8951 Solved: 2860 Description 火星 ...

  5. 【bzoj1014】: [JSOI2008]火星人prefix 平衡树-字符串-hash-二分

    [bzoj1014]: [JSOI2008]火星人 用平衡树维护字符串的hash 然后询问的时候二分一下就好了 /* http://www.cnblogs.com/karl07/ */ #includ ...

  6. BZOJ 1014: [JSOI2008]火星人prefix [splay 二分+hash] 【未完】

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6243  Solved: 2007[Submit] ...

  7. BZOJ 1014: [JSOI2008]火星人prefix( splay + hash )

    用splay维护序列, 二分+hash来判断LCQ.. #include<bits/stdc++.h> using namespace std; typedef unsigned long ...

  8. BZOJ 1014 [JSOI2008]火星人prefix (Splay + Hash + 二分)

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8112  Solved: 2569[Submit] ...

  9. 【BZOJ1014】[JSOI2008]火星人prefix Splay+hash

    [BZOJ1014][JSOI2008]火星人prefix Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个 ...

随机推荐

  1. 关于root

    1.root优缺 android的root跟苹果越狱很类似,可以享受"解禁"后的很多自由. 1.删除系统中不需要的一些app,特别是一些厂商强制安装的app. 2.美化系统,例如修 ...

  2. javascript中用闭包递归遍历树状数组

    做公司项目时,要求写一个方法,方法的参数为一个菜单数组集合和一个菜单id,菜单数组的格式为树状json,如下面所示: [{"id":28,"text":&quo ...

  3. 39 - 同步-异步-IO多路复用

    目录 1 同步与异步 2 阻塞与非阻塞 3 什么是IO 3.1 内核态用户态 3.2 IO两个阶段 3.3 IO模型 3.3.1 同步阻塞IO 3.3.2 同步非阻塞IO 3.3.3 IO多路复用 3 ...

  4. Next Permutation & Previous Permutation

    Next Permutation Given a list of integers, which denote a permutation. Find the next permutation in ...

  5. 公司内网yum源

    新增yum源配置文件 vi /etc/yum.repos.d/szyum.repo 内容如下: #[redhat6.3] [base] name=redhat63 baseurl=http://10. ...

  6. ArcGIS RunTime Sdk +WPF 基础地图显示

    1 简单的地图展示 ArcGISRunTime 的平面地图展示主要依赖MapView这个控件,MapView是地图的容器,Map主要是图层的集合 (注:三维场景的显示主要依赖SceneView这个控件 ...

  7. python基础--面向对象

    什么是面向对象编程 OOP编程是利用“类”和对象来创建各种模型来实现对真实世界的描述. OOP具有可维护性和可扩展性 二:面向对象有那些特性 1)CLASS类:一个类是对拥有相同属性的对象的抽象.类拥 ...

  8. java基础55 UDP通讯协议和TCP通讯协议

    本文知识点(目录): 1.概述    2.UDP通讯协议    3.TCPP通讯协议 1.概述 1.在java中网络通讯作为Socket(插座)通讯,要求两台都必须安装socket.    2.不同的 ...

  9. No.20 selenium学习之路之文件读写

    1.open 使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('thefile.tx ...

  10. jmock2.5 基本教程

    目录 第0章 概述 第1章 jmock初体验 第2章 期望 第3章 返回值 第4章 参数匹配 第5章 指定方法调用次数 第6章 指定执行序列 第7章 状态机 第0章 概述 现在的dev不是仅仅要写co ...