这个操作十分的复杂

但是可以拿平衡树维护

直接二分答案然后用$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. linux服务-ssh

    任务目标:ssh登录,scp上传.下载,ssh秘钥登录, 修改ssh server端的端口为8888然后进行登录和scp测试 使用ssh登陆host1 使用scp下载文件 scp root@192.1 ...

  2. 在Linode VPS上搭建最新版Transmission

    在Linode VPS上搭建最新版Transmission 2015-09-16 by Hansen 原文链接:http://www.hansendong.me/archives/124.html 以 ...

  3. popular short sentences

    backward compatibility 向后兼容 archive 文档

  4. 公司内网yum源

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

  5. aarch64_l1

    L-function-1.23-18.fc26.aarch64.rpm 2017-02-14 08:01 139K fedora Mirroring Project L-function-devel- ...

  6. 一步一步搭建11gR2 rac+dg之DG 机器配置(七)【转】

    DG 机器配置 转自: 一步一步搭建11gR2 rac+dg之DG 机器配置(七)-lhrbest-ITPUB博客http://blog.itpub.net/26736162/viewspace-12 ...

  7. 『实践』百度地图给多个marker添加右键菜单(删除、更新)

    js: $.getJSON("./GetStationPlaceServlet",function(json){ for(var i=0;i<json.length;i++) ...

  8. 详述Java对象创建

    Java是一门面向对象的语言,Java程序运行过程中无时无刻都有对象被创建出来.在语言层面上,创建对象(克隆.反序列化)就是一个new关键字而已,但是虚拟机层面上却不是如此.我们看一下在虚拟机层面上创 ...

  9. JQ + CSS实现浪漫表白必备

    JQ + CSS实现浪漫表白必备页面 效果图: 图片素材 : 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <meta ...

  10. [android]解析XML文件的方法有三种:PULL,DOM,SAM

    PULL 的工作原理: XML pull提供了开始元素和结束元素.当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据.当解析到一个文档结束时,自动生成EndDocu ...