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 16
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

HINT

splay区间操作的裸题,就当是练习模板吧!

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 #include<iostream>
  5 using namespace std;
  6 int t,a,p = 1;
  7 char cmd[20],s[1024*1024+10];
  8 class Splay
  9 {
 10 private:
 11     struct Node
 12     {
 13         char ch;int size,cnt;Node *c[2],*fa;
 14         Node (char _ch,Node *_fa)
 15         {
 16             ch = _ch; fa = _fa;
 17             cnt = 1; c[0] = c[1] = NULL;
 18         }
 19         int lsz(){return c[0]?c[0]->size:0;}
 20         int rsz(){return c[1]?c[1]->size:0;}
 21     };
 22     Node *root;
 23     inline void upd(Node *tag)
 24     {
 25         if (!tag) return;
 26         tag->size = tag->cnt+tag->lsz()+tag->rsz();
 27     }
 28     inline void zig(Node *tag,int d)
 29     {
 30         Node *f = tag -> fa;
 31         int anti = d^1;
 32         f -> c[d] = tag->c[anti];
 33         if (f->c[d])
 34             f -> c[d] -> fa = f;
 35         tag -> fa = f -> fa;
 36         if (tag -> fa -> c[0] == f)
 37             tag -> fa -> c[0] = tag;
 38         else tag -> fa -> c[1] = tag;
 39         f -> fa = tag;
 40         tag -> c[anti] = f;
 41         upd(f);
 42     }
 43     inline bool f(Node *tag){return tag->fa->c[1] == tag;}
 44     inline void splay(Node *tag,Node *goal)
 45       {
 46            while(tag->fa != goal){
 47              if(tag->fa->fa == goal)
 48                 zig(tag,f(tag));
 49              else{
 50                 if(f(tag) == f(tag->fa))
 51                   zig(tag->fa,f(tag->fa)),zig(tag,f(tag));
 52                 else
 53                   zig(tag,f(tag)),zig(tag,f(tag));
 54              }
 55            }
 56            upd(tag);
 57       }
 58     inline Node *search(int key)
 59     {
 60         Node *tag = root->c[0];
 61         while (tag && (key <= tag->lsz()||key > tag -> lsz() + tag -> cnt))
 62         {
 63             if (key > tag ->lsz()+tag->cnt)
 64             {
 65                 key -= tag->lsz()+tag->cnt; tag = tag->c[1];
 66             }
 67             else tag = tag -> c[0];
 68         }
 69         return tag;
 70     }
 71 public:
 72     Splay()
 73     {
 74         root = new Node('#',NULL); Node *tmp = new Node('^',root); root ->c[0] = tmp; upd(tmp);
 75     }
 76     void insert(char *s)
 77     {
 78         Node *chr = new Node(s[0],NULL),*tmp,*now,*tag = root->c[0];
 79         tmp = now = chr; chr -> size = a;
 80         for (int i = 1;i < a;++i)
 81         {
 82             now = new Node(s[i],tmp);
 83             tmp -> c[1] = now; now -> size = a-i;
 84             tmp = now;
 85         }
 86         Node *z = tag -> c[1];
 87         while (z && z->c[0]) z = z->c[0];
 88         if (z)
 89         {
 90             splay(z,tag);
 91             z -> c[0] = chr; chr -> fa = z;
 92             upd(z);
 93         }
 94         else
 95         {
 96             tag -> c[1] = chr; chr -> fa = tag;
 97             upd(tag);
 98         }
 99     }
100     void trans(int x) {Node *tag = search(x); splay(tag,root);}
101     void erase(int l)
102     {
103         Node *tag = root->c[0]; if (!tag) return;
104         Node *end = search(tag->lsz()+tag->cnt+l+1);
105         if (end){splay(end,tag); end -> c[0] = NULL; upd(end);}
106         else tag -> c[1] = NULL;
107         upd(tag);
108     }
109     void print(int l)
110     {
111         Node *tag = root->c[0];
112         for (int i = 1;i <= l;++i)
113         {
114             Node *tmp = search(p+i);
115             splay(tmp,tag);
116             putchar(tmp -> ch);
117         }
118         putchar('\n');
119     }
120 }tree;
121 int main()
122 {
123     freopen("1507.in","r",stdin);
124     freopen("1507.out","w",stdout);
125     scanf("%d",&t);
126     while (t--)
127     {
128         scanf("%s %d",cmd,&a);
129         if (cmd[0] == 'I')
130         {
131             char c;
132             for (int i = 0;i<a;)
133             {
134                 while ((c = getchar())==10||c == 13);
135                 s[i++] = c;
136             }
137             tree.insert(s); continue;
138         }
139         if (cmd[0] == 'M')
140         {
141             tree.trans(a+1); p = a + 1; continue;
142         }
143         if (cmd[0] == 'D')
144         {
145             tree.erase(a); continue;
146         }
147         if (cmd[0] == 'G')
148         {
149             tree.print(a); continue;
150         }
151         if (cmd[0] == 'P')
152         {
153             tree.trans(--p); continue;
154         }
155         if(cmd[0] == 'N')
156         {
157         tree.trans(++ p); continue;
158         }
159     }
160     fclose(stdin); fclose(stdout);
161     return 0;
162 }

View Code

转载于:https://www.cnblogs.com/mmlz/p/4294479.html

BZOJ 1507 Editor相关推荐

  1. bzoj 1269 editor

    这个题和维修数列一比就简单了许多,只要把所谓的光标处理好就OK 了,就是字符串处理的时候比较麻烦,需要多调试一下.这个题不用回收空间了,不过插入的时候还是要递归建树再插入,这样可以防止树的深度过大导致 ...

  2. python 写入excel数据xlwt_用python包xlwt将数据写入Excel中

    一般用两种格式的数据写入,不多说放上demo. 1.列表形式写入 import xlwt def data_write(file_path, datas): f = xlwt.Workbook() s ...

  3. BZOJ 1269: [AHOI2006]文本编辑器editor Splay

    F.A.Qs Web Board Home ProblemSet Status Ranklist Contest ModifyUser   yejinru(0) Logout 捐赠本站 Notice: ...

  4. bzoj 乱刷计划 50/50

    前言 话说第一个板刷计划由于种种原因而告一段落了..其实那一版还有很多题想做,那就只能放一放了 附上效果图一张(几乎每一题都在我博客有题解): 打算 可以复习,重做自己做过的题,不局限于没做过的 乱刷 ...

  5. BZOJ刷题记录---提高组难度

    BZOJ刷题记录---提高组难度 总目录详见https://blog.csdn.net/mrcrack/article/details/90228694 序号 题号 算法 思想难度 实现难度 总难度 ...

  6. BZOJ ac100题存档

    不知不觉AC100题了,放眼望去好像都是水题.在这里就做一个存档吧(特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/ ...

  7. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  8. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  9. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

最新文章

  1. vue中动态样式不起作用? scoped了解一下
  2. 伪数组(ArrayLike)
  3. 深度丨2017年深度学习重大研究进展全解读
  4. 检查PHP会话是否已经开始
  5. Linux内核网络性能优化
  6. python使用函数的优点-原来 Python 还有这些实用的功能和特点!
  7. View 的 android:visibility属性的讨论
  8. 精读《国际化布局 - Logical Properties》
  9. PG基于pgpool-II实现读写分离和负载均衡
  10. java 获取日期的几天前,几个月前和几年前
  11. 怎么给没链接的flash加超链接
  12. no ip domain-lookup 是什么意思?
  13. 在年轻人的兴趣场景里,TT语音母公司趣丸掘金语音社交
  14. 这些痛,只有程序员懂…
  15. ps cs6如何破解
  16. 删除gluster volume数据报错:no space left
  17. HTML动画XYZ轴的用法详解
  18. Tomcat部署Web项目
  19. 全面理解EOS——2.加入EOS主网和测试网
  20. 网络命令 netstat -anp

热门文章

  1. springboot供应商管理系统毕业设计源码121518
  2. 【备忘录】浏览器不能上网但是微信能收到消息的一个解决办法
  3. SwiftUI学习笔记[path绘制]
  4. larval 捕获mysql错误_larval中怎样捕获mysql错误
  5. 12种 vo2dto 方法,就 BeanUtils.copyProperties 压测最拉胯!【快双11了,别用错喽】
  6. 计算机操作系统实验之进程调度(一)轮转调度法(C语言)
  7. 量化思维与常见的量化标
  8. 电容实际等效模型(容抗、感抗、品质因数Q)
  9. 数独问题每行每列每3X3
  10. 土豆网、六间房等在线视频FLV文件下载方法