【BZOJ1269】[AHOI2006]文本编辑器editor

Description

这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器。你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义:   文本:由0个或多个字符构成的序列。这些字符的ASCII码在闭区间[32, 126]内,也就是说,这些字符均为可见字符或空格。光标:在一段文本中用于指示位置的标记,可以位于文本的第一个字符之前,文本的最后一个字符之后或文本的某两个相邻字符之间。文本编辑器:为一个可以对一段文本和该文本中的一个光标进行如下七条操作的程序。如果这段文本为空,我们就说这个文本编辑器是空的。 编写一个程序: 建立一个空的文本编辑器。 从输入文件中读入一些操作指令并执行。 对所有执行过的GET操作,将指定的内容写入输出文件。

Input

输入文件中第一行是指令条数N,以下是需要执行的N个操作。除了回车符之外,输入文件的所有字符的ASCII码都在闭区间[32, 126]内。且行尾没有空格。

Output

依次对应输入文件中每条GET指令的输出,不得有任何多余的字符。

Sample Input

10
Insert 13
Balanced eert
Move 2
Delete 5
Next
Insert 7
editor
Move 0
Get
Move 11
Rotate 4
Get

Sample Output

B
t

HINT

对输入数据我们有如下假定: MOVE操作不超过50 000个,INSERT、DELETE和ROTATE操作作的总个数不超过6 000,GET操作不超过20 000个,PREV和NEXT操作的总个数不超过20 000。 所有INSERT插入的字符数之和不超过2M(1M=1 024*1 024)。 DELETE操作、ROTATE操作和GET操作执行时光标后必然有足够的字符。MOVE、PREV、NEXT操作不会把光标移动到非法位置。 输入文件没有错误。

题解:依旧是Splay裸题,但是有一点很坑:

就是gets()在读入整行时会忽略前导的空格,于是我们必须在读入上一个变量时加一个scanf("%*c")或者getchar()来防止将空格省略掉,或者一个一个字符读进来

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. using namespace std;
  5. int n,m,root,now,tot;
  6. struct node
  7. {
  8. int ch[2],fa,v,siz,tag;
  9. }s[1024*2048+10];
  10. char str[1024*2048+10];
  11. void pushup(int x)
  12. {
  13. s[x].siz=s[s[x].ch[0]].siz+s[s[x].ch[1]].siz+1;
  14. }
  15. void pushdown(int x)
  16. {
  17. if(s[x].tag)
  18. {
  19. swap(s[x].ch[0],s[x].ch[1]);
  20. s[s[x].ch[0]].tag^=1,s[s[x].ch[1]].tag^=1;
  21. s[x].tag=0;
  22. }
  23. }
  24. int find(int y,int x)
  25. {
  26. if(!x) return 0;
  27. pushdown(x);
  28. if(s[s[x].ch[0]].siz>=y) return find(y,s[x].ch[0]);
  29. if(s[s[x].ch[0]].siz+1==y) return x;
  30. return find(y-s[s[x].ch[0]].siz-1,s[x].ch[1]);
  31. }
  32. void rotate(int x,int &k)
  33. {
  34. int y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);
  35. if(z) s[z].ch[(y==s[z].ch[1])]=x;
  36. if(y==k) k=x;
  37. s[x].fa=z,s[y].fa=x,s[y].ch[d]=s[x].ch[d^1];
  38. if(s[x].ch[d^1]) s[s[x].ch[d^1]].fa=y;
  39. s[x].ch[d^1]=y;
  40. pushup(y),pushup(x);
  41. }
  42. void splay(int x,int &k)
  43. {
  44. while(x!=k)
  45. {
  46. int y=s[x].fa,z=s[y].fa;
  47. if(y!=k)
  48. {
  49. if((x==s[y].ch[0])^(y==s[z].ch[0])) rotate(x,k);
  50. else rotate(y,k);
  51. }
  52. rotate(x,k);
  53. }
  54. }
  55. void build(int l,int r,int last,int d)
  56. {
  57. if(l>r) return ;
  58. int tmp=++tot,mid=l+r>>1;
  59. s[tmp].fa=last;
  60. s[last].ch[d]=tmp;
  61. s[tmp].v=str[mid]-32;
  62. build(l,mid-1,tmp,0),build(mid+1,r,tmp,1);
  63. pushup(tmp);
  64. }
  65. int main()
  66. {
  67. scanf("%d",&n);
  68. s[1].ch[1]=2,s[1].siz=2,s[2].siz=1,s[2].fa=1,now=root=1,tot=2;
  69. for(int i=1;i<=n;i++)
  70. {
  71. scanf("%s",str);
  72. switch(str[0])
  73. {
  74. case 'M':
  75. {
  76. scanf("%d",&now),now++;
  77. break;
  78. }
  79. case 'I':
  80. {
  81. scanf("%d%*c",&m);
  82. gets(str);
  83. splay(find(now,root),root),splay(find(now+1,root),s[root].ch[1]);
  84. build(0,m-1,s[root].ch[1],0);
  85. pushup(s[root].ch[1]),pushup(root);
  86. break;
  87. }
  88. case 'D':
  89. {
  90. scanf("%d",&m);
  91. splay(find(now,root),root),splay(find(now+m+1,root),s[root].ch[1]);
  92. s[s[root].ch[1]].ch[0]=0;
  93. pushup(s[root].ch[1]),pushup(root);
  94. break;
  95. }
  96. case 'R':
  97. {
  98. scanf("%d",&m);
  99. splay(find(now,root),root),splay(find(now+m+1,root),s[root].ch[1]);
  100. s[s[s[root].ch[1]].ch[0]].tag^=1;
  101. break;
  102. }
  103. case 'G':
  104. {
  105. printf("%c\n",s[find(now+1,root)].v+32);
  106. break;
  107. }
  108. case 'P':
  109. {
  110. now--;
  111. break;
  112. }
  113. case 'N':
  114. {
  115. now++;
  116. break;
  117. }
  118. }
  119. }
  120. return 0;
  121. }

【BZOJ1507】[NOI2003]editor

Description

Input

输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作。其中: 为了使输入文件便于阅读,Insert操作的字符串中可能会插入一些回车符,请忽略掉它们(如果难以理解这句话,可以参考样例)。 除了回车符之外,输入文件的所有字符的ASCII码都在闭区间[32, 126]内。且行尾没有空格。 这里我们有如下假定:  MOVE操作不超过50000个,INSERT和DELETE操作的总个数不超过4000,PREV和NEXT操作的总个数不超过200000。  所有INSERT插入的字符数之和不超过2M(1M=1024*1024),正确的输出文件长度不超过3M字节。  DELETE操作和GET操作执行时光标后必然有足够的字符。MOVE、PREV、NEXT操作必然不会试图把光标移动到非法位置。  输入文件没有错误。 对C++选手的提示:经测试,最大的测试数据使用fstream进行输入有可能会比使用stdio慢约1秒。

Output

输出文件editor.out的每行依次对应输入文件中每条GET指令的输出。

Sample Input

15
Insert 26
abcdefghijklmnop
qrstuv wxy
Move 15
Delete 11
Move 5
Insert 1
^
Next
Insert 1
_
Next
Next
Insert 4
.\/.
Get 4
Prev
Insert 1
^
Move 0
Get 22

Sample Output

.\/.
abcde^_^f.\/.ghijklmno

题解:本题注意事项:

1.读入有换行,要一个一个字符读入

2.网上有人说要防止溢出,感觉没啥用

3.输出时候不要太麻烦哦~

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. using namespace std;
  5. int n,m,root,now,tot;
  6. struct node
  7. {
  8. int ch[2],fa,v,siz;
  9. }s[1024*2048+10];
  10. char str[1024*2048+10];
  11. void pushup(int x)
  12. {
  13. s[x].siz=s[s[x].ch[0]].siz+s[s[x].ch[1]].siz+1;
  14. }
  15. int find(int y,int x)
  16. {
  17. if(!x) return 0;
  18. if(s[s[x].ch[0]].siz>=y) return find(y,s[x].ch[0]);
  19. if(s[s[x].ch[0]].siz+1==y) return x;
  20. return find(y-s[s[x].ch[0]].siz-1,s[x].ch[1]);
  21. }
  22. void rotate(int x,int &k)
  23. {
  24. int y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);
  25. if(z) s[z].ch[(y==s[z].ch[1])]=x;
  26. if(y==k) k=x;
  27. s[x].fa=z,s[y].fa=x,s[y].ch[d]=s[x].ch[d^1];
  28. if(s[x].ch[d^1]) s[s[x].ch[d^1]].fa=y;
  29. s[x].ch[d^1]=y;
  30. pushup(y),pushup(x);
  31. }
  32. void splay(int x,int &k)
  33. {
  34. while(x!=k)
  35. {
  36. int y=s[x].fa,z=s[y].fa;
  37. if(y!=k)
  38. {
  39. if((x==s[y].ch[0])^(y==s[z].ch[0])) rotate(x,k);
  40. else rotate(y,k);
  41. }
  42. rotate(x,k);
  43. }
  44. }
  45. void build(int l,int r,int last,int d)
  46. {
  47. if(l>r) return ;
  48. int tmp=++tot,mid=l+r>>1;
  49. s[tmp].fa=last,s[last].ch[d]=tmp,s[tmp].v=str[mid]-32;
  50. build(l,mid-1,tmp,0),build(mid+1,r,tmp,1);
  51. pushup(tmp);
  52. }
  53. void print(int x)
  54. {
  55. if(s[x].ch[0]) print(s[x].ch[0]);
  56. putchar(s[x].v+32);
  57. if(s[x].ch[1]) print(s[x].ch[1]);
  58. }
  59. int main()
  60. {
  61. scanf("%d",&n);
  62. int i,j;
  63. s[1].ch[1]=2,s[1].siz=2,s[2].siz=1,s[2].fa=1,now=root=1,tot=2;
  64. for(i=1;i<=n;i++)
  65. {
  66. scanf("%s",str);
  67. switch(str[0])
  68. {
  69. case 'M':{scanf("%d",&now),now++; break;}
  70. case 'I':
  71. {
  72. scanf("%d%*c",&m);
  73. for(j=0;j<m;j+=(str[j]!='\n'&&str[j]!='\r')) str[j]=getchar();
  74. splay(find(now,root),root),splay(find(now+1,root),s[root].ch[1]);
  75. build(0,m-1,s[root].ch[1],0);
  76. pushup(s[root].ch[1]),pushup(root);
  77. break;
  78. }
  79. case 'D':
  80. {
  81. scanf("%d",&m);
  82. splay(find(now,root),root),splay(find(now+m+1,root),s[root].ch[1]);
  83. s[s[root].ch[1]].ch[0]=0;
  84. pushup(s[root].ch[1]),pushup(root);
  85. break;
  86. }
  87. case 'G':
  88. {
  89. scanf("%d",&m);
  90. splay(find(now,root),root),splay(find(now+m+1,root),s[root].ch[1]);
  91. print(s[s[root].ch[1]].ch[0]);
  92. printf("\n");
  93. break;
  94. }
  95. case 'P':{now--; break;}
  96. case 'N':{now++; break;}
  97. }
  98. }
  99. return 0;
  100. }

【BZOJ1269/1507】[AHOI2006]文本编辑器editor Splay的更多相关文章

  1. 【bzoj1507】[NOI2003]Editor /【bzoj1269】[AHOI2006]文本编辑器editor Splay

    [bzoj1507][NOI2003]Editor 题目描述 输入 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中 ...

  2. BZOJ 1269: [AHOI2006]文本编辑器editor( splay )

    splay..( BZOJ 1507 题目基本相同..双倍经验 ) ------------------------------------------------------------------ ...

  3. [bzoj1269][AHOI2006文本编辑器editor] (splay模版题 or pb_ds [rope]大法)

    Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义:   文本:由0个或 ...

  4. [BZOJ1269] [AHOI2006] 文本编辑器editor (splay)

    Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义:  文本:由0个或多 ...

  5. 【BZOJ1269】[AHOI2006] 文本编辑器editor(Splay)

    点此看题面 大致题意: 让你维护一个字符串,有插入字符串.删除区间.反转区间和输出单个字符操作. \(Splay\) 这应该是一道比较简单的\(Splay\)题(虽然因为各种细节我调了很久). 我们可 ...

  6. 【bzoj1269】[AHOI2006]文本编辑器editor

    在bzoj上乱翻,发现了可持久化并查集,然后baidu了一下,发现一种叫rope的东西.   !!!真的太爽了!!!   直接上代码,感受一下(也是蒯来的).       由于rope的底层实现,in ...

  7. BZOJ1269 [AHOI2006]文本编辑器editor 【82行splay】

    1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4633  Solved: 1782 [Sub ...

  8. BZOJ 1269: [AHOI2006]文本编辑器editor (splay tree)

    1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1213  Solved: 454[Submit ...

  9. BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor

    BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor 题意: 分析: splay模拟即可 注意1507的读入格式 ...

随机推荐

  1. C# 关于JArray和JObject封装JSON对象

    直入主题,不废话... 1.JObject:基本的json对象 /// <summary> /// Gets the j object. /// </summary> /// ...

  2. mongodb如何查询某个字段多个值的数据

    数据库  python  mongodb 4.9k 次浏览 问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键内容,没有改进余地 如何查询mongodb某个集合里面某一个字段为多个情 ...

  3. OpenMediaVault的OwnCloud扩展不支持NTFS格式硬盘

    来源https://forum.openmediavault.org/index.php/Thread/15510-OwnCloud-Operation-not-supported-setfacl/ ...

  4. Intellij IDEA Module 的Language Level的问题

    最近从github上fork了张开涛的Shiro代码,IDE是Intellij IDEA.发现无论是Project还是Module,默认的Language Level都是JDK 1.5,而且每次修改都 ...

  5. SSL双向认证Java实现 Tomcat篇

    双向验证,在客户机连接服务器时,客户机验证服务器的证书,服务器验证客户机的证书,链接双方都要对彼此的数字证书进行验证,保证这是经过授权的才能够连接. 1. 生成服务器端的keystore和trusts ...

  6. 关于VS2012连接MySql数据库时无法选择数据源

    您的C#开发工具是用VS2012吗?    No! return;    您的数据库用的是MySql吗?     No! return;    您新建ADO.NET数据实体模型的时候选择数据源的时候没 ...

  7. 【Java NIO的深入研究6】JAVA NIO之Scatter/Gather

    Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作. 分散(s ...

  8. Windows 上 GitHub Desktop 的操作[转]

    第1章 上传开源代码至GitHub    1 1.1 git Windows 客户端    1 1.2 注册GitHub账户    2 1.3 登录    2 1.4 创建本地代码仓库    2 1. ...

  9. opengl 模板测试 glStencilOp glStencilFunc

    下面来设置蒙板缓存和蒙板测试. 首先我们启用蒙板测试,这样就可以修改蒙板缓存中的值. 下面我们来解释蒙板测试函数的含义: 当你使用glEnable(GL_STENCIL_TEST)启用蒙板测试之后,蒙 ...

  10. 做游戏长知识------基于行为树与状态机的游戏AI(一)

    孙广东 2014.6.30 AI. 我们的第一印象可能是机器人,如今主要说在游戏中的应用. 现代的计算机游戏中已经大量融入了AI元素,平时我们进行游戏时产生的交互都是由AI来完毕的.比方在RPG游戏中 ...