题意翻译

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

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

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

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

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

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

Translated by @litble

题目描述

PDF

输入输出格式

输入格式:

输出格式:

输入输出样例

输入样例#1:

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

  1. bcdef
  2. bcg
  3. bxyc
 

Solution:

  本题可持久化平衡树裸题,画风和神犇CLJ的可持久化数据结构研究中的最后一题超级编辑器,貌似没啥区别。

  我们用可持久化平衡树维护字符串的中序遍历,对于各操作:

    1、在上一版本的某一位置加入一段字符串:对加入的字符串中序遍历建树(因为treap的随机值原因,树根不一定是$\frac{1+n}{2}$,这里我骚操作每个节点的键值都加上父亲的键值以保证树的形态),然后将原版本的树以插入位置split,再二次merge。

    2、删除上一版本的某一位置开始的一段长度的字符串:先split出这段区间,然后merge左右子树。

    3、输出某一版本的某一位置开始的一段长度的字符串:先split出这段区间,然后中序遍历这段区间。

  注意本题强制在线需要统计输出的字符$c$的个数。

代码:

  1. /*Code by 520 -- 9.27*/
  2. #include<bits/stdc++.h>
  3. #define il inline
  4. #define ll long long
  5. #define RE register
  6. #define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
  7. #define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
  8. using namespace std;
  9. const int N=;
  10. int n,cnt,now,tc,root[];
  11. struct node{
  12. int ls,rs,date,siz,rnd;
  13. }t[N];
  14. char s[];
  15.  
  16. int newnode(int v){
  17. ++cnt;
  18. t[cnt].date=v,t[cnt].siz=,t[cnt].rnd=rand()%;
  19. return cnt;
  20. }
  21.  
  22. il void up(int rt){t[rt].siz=t[t[rt].ls].siz+t[t[rt].rs].siz+;}
  23.  
  24. int merge(int x,int y){
  25. if(!x||!y) return x+y;
  26. if(t[x].rnd<t[y].rnd){
  27. int p=++cnt;t[p]=t[x];
  28. t[p].rs=merge(t[p].rs,y);
  29. up(p);
  30. return p;
  31. }
  32. else {
  33. int p=++cnt;t[p]=t[y];
  34. t[p].ls=merge(x,t[p].ls);
  35. up(p);
  36. return p;
  37. }
  38. }
  39.  
  40. void split(int rt,int k,int &x,int &y){
  41. if(!rt) {x=,y=;return;}
  42. if(t[t[rt].ls].siz<k) {
  43. x=++cnt;t[x]=t[rt];
  44. split(t[x].rs,k-t[t[rt].ls].siz-,t[x].rs,y);
  45. up(x);
  46. }
  47. else {
  48. y=++cnt;t[y]=t[rt];
  49. split(t[y].ls,k,x,t[y].ls);
  50. up(y);
  51. }
  52. }
  53.  
  54. int build(int l,int r,int lst) {
  55. if(l>r) return ;
  56. int m=l+r>>,rt=newnode(s[m]);
  57. t[rt].rnd+=lst;
  58. t[rt].ls=build(l,m-,t[rt].rnd),t[rt].rs=build(m+,r,t[rt].rnd);
  59. up(rt);
  60. return rt;
  61. }
  62.  
  63. void print(int rt){
  64. if(!rt) return;
  65. print(t[rt].ls);
  66. putchar(t[rt].date);
  67. if(t[rt].date=='c') tc++;
  68. print(t[rt].rs);
  69. }
  70.  
  71. int main(){
  72. int opt,p,q,v,x,y,z,rt;
  73. while(scanf("%d",&n)!=EOF){
  74. while(n--){
  75. scanf("%d",&opt);
  76. if(opt==){
  77. scanf("%d%s",&p,s+);
  78. rt=build(,strlen(s+),);
  79. p-=tc,++now;
  80. if(!p) root[now]=merge(rt,root[now-]);
  81. else if(p==t[root[now-]].siz) root[now]=merge(root[now-],rt);
  82. else {
  83. x=y=; split(root[now-],p,x,y);
  84. root[now]=merge(x,rt),root[now]=merge(root[now],y);
  85. }
  86. }
  87. else if(opt==){
  88. ++now;
  89. scanf("%d%d",&p,&q),p-=tc,q-=tc;
  90. x=y=z=;
  91. split(root[now-],p-,x,y),split(y,q,y,z);
  92. root[now]=merge(x,z);
  93. }
  94. else {
  95. scanf("%d%d%d",&v,&p,&q),v-=tc,p-=tc,q-=tc;
  96. x=y=z=;
  97. split(root[v],p-,x,y),split(y,q,y,z);
  98. print(y),putchar('\n');
  99. }
  100. }
  101. tc=cnt=now=;memset(root,,sizeof(root));
  102. }
  103. return ;
  104. }

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. Python学习过程笔记整理(一)

    编码方式 -Utf8编码方式:# -*- coding: utf-8 -*- 注释 -行注释 # -块注释 '''...'''或"""...""&qu ...

  2. Datawhale MySQL 训练营 Task5

    数据导入导出 导入table http://www.runoob.com/mysql/mysql-database-import.html 导出table http://www.runoob.com/ ...

  3. uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)"解决办法

    如果在编译MFC程序的时候出现下列及类似的错误: 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator ...

  4. php学习--变量和数据类型

    PHP变量 变量 ​ 程序执行期间,可以变化的量即为变量. 声明变量 以美元$ 符号声明 注意:(PHP严格区分大小写) 变量名称以 字母.或下划线开始,后面跟上数字/字母/下划线,不能包含特殊字符 ...

  5. Django数据库 相关之select_related/prefetch_related

    - 性能相关 user_list = models.UserInfo.objects.all() for row in user_list: # 只去取当前表数据 select_related,主动连 ...

  6. aircrack-ng无线破解实验

    查看无线网卡 airmon-ng 开启网卡监听模式 airmon-ng start wlan0 扫描附近的wifi airodump-ng wlan0mon 停止扫描: ctrl c 使用airodu ...

  7. 华策光通信: LED可见光通信室内定位项目获最具投资价值奖

    3月21日上午,一场持续3个多小时的O2O领域的创业DemoShow在深圳科兴科学园会议中心激烈上演.来自华策光通信的基于LED可见光通信室内精准定位项目作为LED与室内定位领域的跨界融合项目经过精彩 ...

  8. 奔跑吧DKY——团队Scrum冲刺阶段-Day 2

    今日完成任务 各个成员今日完成的任务(如果完成的任务为开发或测试任务,需给出对应的Github代码签入记录截图:如果完成的任务为调研任务,需给出对应的调研总结博客链接:如果完成的任务为学习技术任务,需 ...

  9. Sprint10

    进展:设置事件提醒部分已经完成,接下来是实现完成后在添加主界面显示已添加的事件及时间,并可设置可用与不可用.

  10. GridView的控件说明[字典]-----方便查询

    GridView 控件以表格的形式显示数据,并提供对数据进行排序,选择,编辑,删除等功能. GridView能够完成的功能具体可以总结如下: 1,通过数据源控件将数据绑定到GridView控件 2,对 ...