这个操作十分的复杂

但是可以拿平衡树维护

直接二分答案然后用$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. vue组件之间传值方式解析

    vue组件之间传值方式解析一.父组件传到子组件 1.父组件parent代码如下: <template> <div class="parent"> <h ...

  2. vtk 基础概念

    #include <vtk-5.10/vtkSmartPointer.h>#include <vtk-5.10/vtkRenderWindow.h>#include <v ...

  3. Android平台介绍

    一.Android平台介绍 什么是智能手机 具有独立的操作系统,独立的运行空间,可以由用户自行安装软件.游戏.导航等第三方应用程序,并可以通过移动通讯网络来实现无线网络接入的手机类型总称. 智能手机操 ...

  4. 20155303狄惟佳预备作业三Linux学习笔记

    20155303狄惟佳预备作业三Linux学习笔记 初次接触Ubuntu系统以及Linux内核,了解了其产生的历史,从感性来讲,深深吸引我的是其中蕴含的珍贵的开源精神,以及Stallman等人对&qu ...

  5. 20165230 2017-2018-2 《Java程序设计》第8周学习总结

    20165230 2017-2018-2 <Java程序设计>第8周学习总结 教材学习内容总结 第十二章 java多线程机制 一个进程在其执行过程中,可产生多个线程.线程是比进程更小的执行 ...

  6. elasticsearch-head插件安装的一些坑!es6.5.4版本

    折腾了一晚上,总算成功了!,大部分坑都记录了下来,版本升级太快真实个大坑,每个版本都不一样,学的心累!! 这坑太多了!主要就是以下几点最主要的: 因为我这里只使用hear安装,不使用哪个打包工具,所以 ...

  7. Centos7安装FTP突然无法登录

    vi /etc/pam.d/vsftpd //注释掉auth required pam_shells.so session optional pam_keyinit.so force revokeau ...

  8. go 函数举例练习

    1. 求1到100之内的所有质数,并打印到屏幕上 package main import "fmt" // 求1-100 内的质数 func justfy(i int) bool ...

  9. 音频增益响度分析 ReplayGain 附完整C代码示例【转】

    转自:http://www.cnblogs.com/cpuimage/p/8846951.html 人们所熟知的图像方面的3A算法有: AF自动对焦(Automatic Focus)自动对焦即调节摄像 ...

  10. ps查看CPU和内存占用前10的进程

    内存增序 ps aux --sort rss 内存减序 ps aux --sort -rss cpu增序 ps auxw --sort=%cpu cpu减序 ps auxw --sort=-%cpu ...