UVA12538 Version Controlled IDE
题意翻译
维护一种数据结构,资磁三种操作。
1.在p位置插入一个字符串s
2.从p位置开始删除长度为c的字符串
3.输出第v个历史版本中从p位置开始的长度为c的字符串
1≤n≤50000,所有字符串总长度小于等于106,输出字符串总长度小于等于20000
强制在线,每次输入中的数字都要减去你的所有输出中字母c的个数
Translated by @litble
题目描述

输入输出格式
输入格式:

输出格式:

输入输出样例
6
1 0 abcdefgh
2 4 3
3 1 2 5
3 3 3 4
1 4 xy
3 5 4 6
bcdef
bcg
bxyc
Solution:
本题可持久化平衡树裸题,画风和神犇CLJ的可持久化数据结构研究中的最后一题超级编辑器,貌似没啥区别。
我们用可持久化平衡树维护字符串的中序遍历,对于各操作:
1、在上一版本的某一位置加入一段字符串:对加入的字符串中序遍历建树(因为treap的随机值原因,树根不一定是$\frac{1+n}{2}$,这里我骚操作每个节点的键值都加上父亲的键值以保证树的形态),然后将原版本的树以插入位置split,再二次merge。
2、删除上一版本的某一位置开始的一段长度的字符串:先split出这段区间,然后merge左右子树。
3、输出某一版本的某一位置开始的一段长度的字符串:先split出这段区间,然后中序遍历这段区间。
注意本题强制在线需要统计输出的字符$c$的个数。
代码:
/*Code by 520 -- 9.27*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=;
int n,cnt,now,tc,root[];
struct node{
int ls,rs,date,siz,rnd;
}t[N];
char s[]; int newnode(int v){
++cnt;
t[cnt].date=v,t[cnt].siz=,t[cnt].rnd=rand()%;
return cnt;
} il void up(int rt){t[rt].siz=t[t[rt].ls].siz+t[t[rt].rs].siz+;} int merge(int x,int y){
if(!x||!y) return x+y;
if(t[x].rnd<t[y].rnd){
int p=++cnt;t[p]=t[x];
t[p].rs=merge(t[p].rs,y);
up(p);
return p;
}
else {
int p=++cnt;t[p]=t[y];
t[p].ls=merge(x,t[p].ls);
up(p);
return p;
}
} void split(int rt,int k,int &x,int &y){
if(!rt) {x=,y=;return;}
if(t[t[rt].ls].siz<k) {
x=++cnt;t[x]=t[rt];
split(t[x].rs,k-t[t[rt].ls].siz-,t[x].rs,y);
up(x);
}
else {
y=++cnt;t[y]=t[rt];
split(t[y].ls,k,x,t[y].ls);
up(y);
}
} int build(int l,int r,int lst) {
if(l>r) return ;
int m=l+r>>,rt=newnode(s[m]);
t[rt].rnd+=lst;
t[rt].ls=build(l,m-,t[rt].rnd),t[rt].rs=build(m+,r,t[rt].rnd);
up(rt);
return rt;
} void print(int rt){
if(!rt) return;
print(t[rt].ls);
putchar(t[rt].date);
if(t[rt].date=='c') tc++;
print(t[rt].rs);
} int main(){
int opt,p,q,v,x,y,z,rt;
while(scanf("%d",&n)!=EOF){
while(n--){
scanf("%d",&opt);
if(opt==){
scanf("%d%s",&p,s+);
rt=build(,strlen(s+),);
p-=tc,++now;
if(!p) root[now]=merge(rt,root[now-]);
else if(p==t[root[now-]].siz) root[now]=merge(root[now-],rt);
else {
x=y=; split(root[now-],p,x,y);
root[now]=merge(x,rt),root[now]=merge(root[now],y);
}
}
else if(opt==){
++now;
scanf("%d%d",&p,&q),p-=tc,q-=tc;
x=y=z=;
split(root[now-],p-,x,y),split(y,q,y,z);
root[now]=merge(x,z);
}
else {
scanf("%d%d%d",&v,&p,&q),v-=tc,p-=tc,q-=tc;
x=y=z=;
split(root[v],p-,x,y),split(y,q,y,z);
print(y),putchar('\n');
}
}
tc=cnt=now=;memset(root,,sizeof(root));
}
return ;
}
UVA12538 Version Controlled IDE的更多相关文章
- UVALive 6145 Version Controlled IDE(可持久化treap、rope)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- UVA 12538 Version Controlled IDE 解题报告
题意:给三种操作 1.在p位置插入一个字符串. 2.从p位置开始删除长度为c的字符串 3.输出第v个历史版本中从p位置开始的长度为c的字符串 解法:可以用平衡树做,但是不会.后来又听说可一用一个叫ro ...
- UVA - 12538 Version Controlled IDE (可持久化treap)
紫薯例题 #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f; ],ch[ ...
- uva12538
12538 Version Controlled IDEProgrammers use version control systems to manage files in their project ...
- IDE spec for registry settings
IDE spec for registry settings Advanced customization of Visual Assist is possible with registry set ...
- How to stop pycharm show files in project in red color?
You can change the file color to whatever you want. File > Settings > Editor > Colors&F ...
- TFS - 使用微软测试管理器实现跨团队项目的测试用例管理
在团队项目之间实现测试用例和测试计划的共享,是很多客户关注的问题.尤其在开发产品+服务的团队中,对测试用例的共享要求比较高.下面就如何在Team Foundation Server中如何实现团队项目之 ...
- 【转】 svn 错误 以及 中文翻译
直接Ctrl+F 搜索你要找的错 # # Simplified Chinese translation for subversion package # This file is distribute ...
- android ButterKnife 解决重复findViewById
简介: 程序员都是懒惰的,不想写一大堆像下面这样的代码 class ExampleActivity extends Activity { TextView title; TextView subtit ...
随机推荐
- flask中的简单的前端写入
那么flask这个框架是web开发,那么肯定离不开前端的一些代码,那么python用的web开发框架 开发所用的前端模板就是jinja2模板.相对于jinja1比起来性能做到了很大的提升,那么Vue一 ...
- UnityShader学习笔记1 — — 入门知识整理
注:资料整理自<Unity Shader入门精要>一书 一.渲染流程概念阶段: 应用阶段:(1)准备好场景数据:(如摄像机位置,物体以及光源等) (2)粗粒度剔除(Culling): ...
- kali虚拟机安装后操作[配置ssh,安装vmtools,更新源]
更新源 # 打开控制台, 输入以下命令打开编辑器修改配置文件 $ leafpad /etc/apt/sources.list #kali官方源 deb http://http.kali.org/kal ...
- linux下实现压测-html报表生成-控制台参数优化【jmeter】
jmeter - 单机压测 - 命令行模式-html报表生成-控制台参数优化 一/ 准备工作 1.压力机安装并配置好 jdk 2.调试好程序脚本 再上传到 linux下 3.进入jmeter bin ...
- VM虚拟机系统时间同步网络时间并登录用户自动校正时间
原文出处: http://blog.51cto.com/wutou/1932317 VM虚拟机大家都用,我在用完后,经常使用"挂起客户机",但是这样一来,系统恢复启动很快,但是少了 ...
- undefined和“undefined”
说实话,它们之间的区别挺明显的,我们一般认为undefined是JavaScript提供的一个“关键字”,而“undefined”却是一个字符串,只是引号的内容和undefined一样. undefi ...
- 为 GlusterFS 设计新的xlator (编译及调用过程分析)
GlusterFS 是一个开源的网络分布式文件系统,前一阵子看了一点GlusterFS(Gluster)的代码,修改了部分代码,具体是增加了一个定制的xlator,简单记录一下. Gluster与xl ...
- 小程序与WebRTC联姻能擦出怎样的火花?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯视频云终端团队发表于云+社区专栏 腾讯视频云终端技术总监,rexchang(常青), 2008 年毕业加入腾讯,一直从事客户端研发 ...
- java按照字节切割字符串,解决汉字的问题
编写一个截取字符串的函数,输入为一个字符串,截取开始地址,截取字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个, 如“我ABC”,0,4,应该截为“我AB”,输入“我ABC汉DEF”,1, ...
- asp.net core如何修改程序监听的端口
asp.net core 默认监听的5000和5001端口,要修改为其他端口有几种方法. 1.硬编码.优点是直观,缺点是每次修改端口都得重新编译程序. public class Program { p ...