题意翻译

维护一种数据结构,资磁三种操作。

1.在p位置插入一个字符串s

2.从p位置开始删除长度为c的字符串

3.输出第v个历史版本中从p位置开始的长度为c的字符串

1≤n≤50000,所有字符串总长度小于等于106,输出字符串总长度小于等于20000

强制在线,每次输入中的数字都要减去你的所有输出中字母c的个数

Translated by @litble

题目描述

PDF

输入输出格式

输入格式:

输出格式:

输入输出样例

输入样例#1:

6
1 0 abcdefgh
2 4 3
3 1 2 5
3 3 3 4
1 4 xy
3 5 4 6
输出样例#1:

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的更多相关文章

  1. UVALive 6145 Version Controlled IDE(可持久化treap、rope)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  2. UVA 12538 Version Controlled IDE 解题报告

    题意:给三种操作 1.在p位置插入一个字符串. 2.从p位置开始删除长度为c的字符串 3.输出第v个历史版本中从p位置开始的长度为c的字符串 解法:可以用平衡树做,但是不会.后来又听说可一用一个叫ro ...

  3. UVA - 12538 Version Controlled IDE (可持久化treap)

    紫薯例题 #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f; ],ch[ ...

  4. uva12538

    12538 Version Controlled IDEProgrammers use version control systems to manage files in their project ...

  5. IDE spec for registry settings

    IDE spec for registry settings Advanced customization of Visual Assist is possible with registry set ...

  6. 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 ...

  7. TFS - 使用微软测试管理器实现跨团队项目的测试用例管理

    在团队项目之间实现测试用例和测试计划的共享,是很多客户关注的问题.尤其在开发产品+服务的团队中,对测试用例的共享要求比较高.下面就如何在Team Foundation Server中如何实现团队项目之 ...

  8. 【转】 svn 错误 以及 中文翻译

    直接Ctrl+F 搜索你要找的错 # # Simplified Chinese translation for subversion package # This file is distribute ...

  9. android ButterKnife 解决重复findViewById

    简介: 程序员都是懒惰的,不想写一大堆像下面这样的代码 class ExampleActivity extends Activity { TextView title; TextView subtit ...

随机推荐

  1. Jmeter接口测试(七)用例数据分离

    之前我们的用例数据都是配置在 Jmeter Http 请求中,每次需要增加,修改用例都需要打开 jmeter 重新编辑,当用例越来越多的时候,用例维护起来就越来越麻烦,有没有好的方法来解决这种情况呢? ...

  2. 火狐浏览器油猴子GreaseMonkey使用教程

    火狐浏览器油猴子GreaseMonkey使用教程 首先下载火狐浏览器 安装成功后用火狐浏览器打开链接,界面如下 然后搜索GreaseMonkey. 搜索结果,图标是个小猴子,然后添加到火狐浏览器,成功 ...

  3. Cinema 4D* 中令人惊叹的体积效果

    原文链接 第一部分 第二部分 云.雾.星云.火状结构等体积效果是 3D 美术师日常工作中的常见任务.借助 Turbulence FD* 或 X-Particles* 等当代第三方插件进行流体或粒子模拟 ...

  4. 【Docker】第二篇 Docker镜像管理

    一.搜索镜像 1.下载一个docker镜像:我们可以通过登陆docker网站搜索自己需要的镜像,可以选择自己所需要的版本,然后通过详情也可以看到:网址:https://hub.docker.com/2 ...

  5. 2、Ansible在使用过程中出现的错误解决方法

    1.安装完成后允许命令出错 Traceback (most recent call last): File "/usr/bin/ansible", line 197, in (ru ...

  6. dvwa——命令注入&文件包含

    命令注入 commond_injection 源码.分析.payload: low: <?php if( isset( $_POST[ 'Submit' ] ) ) { // Get input ...

  7. 最新!2016中国城市GDP排名出炉

    2017年1月20日,国家统计局公布:2016年中国国内生产总值GDP达744127亿元,同比增长6.7%,城市GDP方面:截至1月20日,全国大部分城市的去年经济运行数据已经公布,根据信息汇总,20 ...

  8. 请教JDBC中的thin和OCI的区别\

    请教JDBC中的thin和OCI的区别 https://zhidao.baidu.com/question/2267123737573204748.html

  9. 数据库——SQL数据定义

    数据定义  SQL的数据定义语句 操 作 对 象 操  作  方  式 创  建 删  除 修  改 表 CREATE TABLE DROP TABLE ALTER TABLE 视  图 CREATE ...

  10. No.10_分数分配

    C#队一共有7名成员,因此团队贡献分一共350分. 分配方式应当反映绝大部分组员的真实贡献情况,即由贡献决定分数. 另外保证一定的奖惩措施,充分调动组员的积极性,鞭策团队向前迈进. 对于团队贡献分数的 ...