后缀平衡树裸题。

后缀平衡树呢,实际上是一个很naive的东西。就是用平衡树维护后缀数组。

这样的话就可以支持在最前端插入一个字符(相当于插入新的后缀)

每次比较节点的tag是O(1)的,所以可以快速的支持插入和查询。

为了保证重构的复杂度,后缀平衡树必须使用重量平衡树。

如替罪羊树,Treap,Weight-Balanced-Finger-Tree等。

#include<bits/stdc++.h>
#define N 1000005
#define lson (o<<1)
#define rson (o<<1|1)
using namespace std;
typedef long long ll;
int c[N][],rnd[N],val[N],cnt;ll key[N];
int t[N<<],pos[N],n,m,type,len,LastOrder=,rt;
char s[N];
inline bool cmp(int x,int y){return (val[x]<val[y]||(val[x]==val[y]&&key[x-]<key[y-]));}
void rebuild(int &x,ll l,ll r){
if(!x)return ;ll mid=(l+r)>>;
key[x]=mid;
rebuild(c[x][],l,mid-);
rebuild(c[x][],mid+,r);
}
inline void rotate(int x,int &y,ll l,ll r){
int p=c[y][]==x;c[y][p]=c[x][p^];
c[x][p^]=y;y=x;
rebuild(y,l,r);
}
void ins(int &x,int p,ll l,ll r){
if(!x){key[x=cnt]=(l+r)>>;return;}
ll mid=(l+r)>>;
if(cmp(p,x)){
ins(c[x][],p,l,mid-);
if(rnd[c[x][]]>rnd[x])rotate(c[x][],x,l,r);
}
else{
ins(c[x][],p,mid+,r);
if(rnd[c[x][]]>rnd[x])rotate(c[x][],x,l,r);
}
}
inline int get(int x,int y){return key[pos[x]]<=key[pos[y]]?x:y;}
inline void pushup(int o){t[o]=get(t[lson],t[rson]);}
void build(int o,int l,int r){
if(l==r){t[o]=l;return;}
int mid=(l+r)>>;
build(lson,l,mid);build(rson,mid+,r);
pushup(o);
}
void change(int o,int l,int r,int q,int v){
if(l==r){pos[q]=v;return;}
int mid=(l+r)>>;
if(q<=mid)change(lson,l,mid,q,v);
else change(rson,mid+,r,q,v);
pushup(o);
}
int query(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return t[o];
int mid=(l+r)>>;
if(qr<=mid)return query(lson,l,mid,ql,qr);
else if(ql>mid)return query(rson,mid+,r,ql,qr);
else return get(query(lson,l,mid,ql,qr),query(rson,mid+,r,ql,qr));
}
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();m=read();len=read();type=read();
scanf("%s",s+);
for(int i=;i<=len;i++){
val[++cnt]=s[len-i+]-'a'+;
rnd[cnt]=rand();
ins(rt,i,,1LL<<);
}
for(int i=;i<=n;i++)pos[i]=read();
build(,,n);
while(m--){
scanf("%s",s);
if(s[]=='I'){
int x=read();if(type)x^=LastOrder;
val[++cnt]=++x;rnd[cnt]=rand();
ins(rt,cnt,,1LL<<);
}
if(s[]=='C'){int x=read(),y=read();change(,,n,x,y);}
if(s[]=='Q'){
int x=read(),y=read();LastOrder;
printf("%d\n",LastOrder=query(,,n,x,y));
}
}
}

【bzoj3682】Phorni的更多相关文章

  1. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  2. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  3. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  5. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  6. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  7. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

  8. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

  9. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

随机推荐

  1. BZOJ 1996 合唱队(DP)

    考虑从最后的队形开始依次还原最初的队形. 对于当前的队形,要么选最左边的,要么选最右边的. 如果选了左边的,那么下次选择的一定是大于它的.右边的同理. 所以定义dp[mark][l][r]为区间[l, ...

  2. 【bzoj4401】块的计数 结论题

    题目描述 给出一棵n个点的树,求有多少个si使得整棵树可以分为n/si个连通块. 输入 第一行一个正整数N,表示这棵树的结点总数,接下来N-1行,每行两个数字X,Y表示编号为X的结点与编号为Y的结点相 ...

  3. Windows相关

    PE WIndows 相关知识 windows 主机防护

  4. BZOJ [Ctsc2002] Award 颁奖典礼 解题报告

    [Ctsc2002] Award 颁奖典礼 Description IOI2002的颁奖典礼将在YONG-IN Hall隆重举行.人们在经历了充满梦幻的世界杯之后变得更加富于情趣.为了使颁奖典礼更具魅 ...

  5. 【BZOJ4889】[Tjoi2017]不勤劳的图书管理员 分块+树状数组

    [BZOJ4889][Tjoi2017]不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让 ...

  6. Spring------mysql读写分离

    1. 为什么要进行读写分离 大量的JavaWeb应用做的是IO密集型任务, 数据库的压力较大, 需要分流 大量的应用场景, 是读多写少, 数据库读取的压力更大 一个很自然的思路是使用一主多从的数据库集 ...

  7. Itext2.0.8 和freemarker导出pdf

    这个是跟上一篇写的freemarker导出word是一块的.但是关联性不是很大.由于本人技术有限本篇导出也是根据网上大家的做出的demo混合而成.有不足的地方请大家指出.好改正,使以后看到的freem ...

  8. Mabatis(2) 全局配置文件

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC & ...

  9. EL表达式获取对象属性的原理

    EL表达式获取对象属性的原理是这样的: 以表达式${user.name}为例 EL表达式会根据name去User类里寻找这个name的get方法,此时会自动把name首字母大写并加上get前缀,一旦找 ...

  10. [洛谷P2023] [AHOI2009]维护序列

    洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...