后缀平衡树裸题。

后缀平衡树呢,实际上是一个很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 2306 幸福路径(DP)

    题解来源:http://www.cnblogs.com/jianglangcaijin/p/3799494.html 最后必然是走了一条链,或者是一个环(一直绕),或者是一条链加一个环.设f[i][j ...

  2. HUAS 1480 虫洞(最短路)

    把每个点拆成两个点,分别表示黑洞和白洞,然后按题意模拟加边跑最短路即可. # include <cstdio> # include <cstring> # include &l ...

  3. [CF622F]The Sum of the k-th Powers

    题目大意:给你$n,k(n\leqslant10^9,k\leqslant10^6)$,求:$$\sum\limits_{i=1}^ni^k\pmod{10^9+7}$$ 题解:可以猜测是一个$k+1 ...

  4. [CEOI2004]锯木厂选址 斜率优化DP

    斜率优化DP 先考虑朴素DP方程, f[i][k]代表第k个厂建在i棵树那里的最小代价,最后答案为f[n+1][3]; f[i][k]=min(f[j][k-1] + 把j+1~i的树都运到i的代价) ...

  5. 【BZOJ5329】【SDOI2018】战略游戏(圆方树,虚树)

    [BZOJ5329][SDOI2018]战略游戏(圆方树,虚树) 题面 BZOJ 洛谷 Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战 ...

  6. HDU3480:Division——题解

    http://acm.hdu.edu.cn/showproblem.php?pid=3480 将一列数划分成几个集合,这些集合的并集为该数列,求每个数列的(最大值-最小值)^2的和的最小值. 简单的d ...

  7. 仅此一文让你明白ASP.NET MVC 之View的显示

    有些人要问题,为什么我要学框架?这里我简单说一下,深入理解一个框架,给你带来最直接的好处: 使用框架时,遇到问题可以快速定位,并知道如何解决: 当框架中有些功能用着不爽时,你可以自由扩展,实现你想要的 ...

  8. ACE反应器(Reactor)模式(2)

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/18/595808.html 在Socket编程中,常见的事件就是"读就绪" ...

  9. Codeforces Round #342 (Div. 2) B

    B. War of the Corporations time limit per test 1 second memory limit per test 256 megabytes input st ...

  10. Java中JAVA_HOME与CLASSPATH的解析(转)

    很多人在初学Java的时候经常会被书中介绍的一堆环境变量的设置搞得头昏脑胀,很多书中都会在初装JDK的时候让他大家设置JAVA_HOME环境变量,在开发程序的时候设置CLASSPATH环境变量,而很多 ...