BZOJ 1507 Editor
Description
Input
Output
Sample Input
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相关推荐
- bzoj 1269 editor
这个题和维修数列一比就简单了许多,只要把所谓的光标处理好就OK 了,就是字符串处理的时候比较麻烦,需要多调试一下.这个题不用回收空间了,不过插入的时候还是要递归建树再插入,这样可以防止树的深度过大导致 ...
- python 写入excel数据xlwt_用python包xlwt将数据写入Excel中
一般用两种格式的数据写入,不多说放上demo. 1.列表形式写入 import xlwt def data_write(file_path, datas): f = xlwt.Workbook() s ...
- BZOJ 1269: [AHOI2006]文本编辑器editor Splay
F.A.Qs Web Board Home ProblemSet Status Ranklist Contest ModifyUser yejinru(0) Logout 捐赠本站 Notice: ...
- bzoj 乱刷计划 50/50
前言 话说第一个板刷计划由于种种原因而告一段落了..其实那一版还有很多题想做,那就只能放一放了 附上效果图一张(几乎每一题都在我博客有题解): 打算 可以复习,重做自己做过的题,不局限于没做过的 乱刷 ...
- BZOJ刷题记录---提高组难度
BZOJ刷题记录---提高组难度 总目录详见https://blog.csdn.net/mrcrack/article/details/90228694 序号 题号 算法 思想难度 实现难度 总难度 ...
- BZOJ ac100题存档
不知不觉AC100题了,放眼望去好像都是水题.在这里就做一个存档吧(特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/ ...
- BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...
- S-T平面图中利用最短路求最小割(BZOJ 1001)
BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...
- BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)
题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...
最新文章
- vue中动态样式不起作用? scoped了解一下
- 伪数组(ArrayLike)
- 深度丨2017年深度学习重大研究进展全解读
- 检查PHP会话是否已经开始
- Linux内核网络性能优化
- python使用函数的优点-原来 Python 还有这些实用的功能和特点!
- View 的 android:visibility属性的讨论
- 精读《国际化布局 - Logical Properties》
- PG基于pgpool-II实现读写分离和负载均衡
- java 获取日期的几天前,几个月前和几年前
- 怎么给没链接的flash加超链接
- no ip domain-lookup 是什么意思?
- 在年轻人的兴趣场景里,TT语音母公司趣丸掘金语音社交
- 这些痛,只有程序员懂…
- ps cs6如何破解
- 删除gluster volume数据报错:no space left
- HTML动画XYZ轴的用法详解
- Tomcat部署Web项目
- 全面理解EOS——2.加入EOS主网和测试网
- 网络命令 netstat -anp