bzoj 1507: [NOI2003]Editor

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<ext/rope>
 4 using namespace std;
 5 using namespace __gnu_cxx;
 6 crope list;
 7 int n,now;
 8 char ch[10],ch1[3000005];
 9 int main()
10 {
11     scanf("%d",&n);
12     for(int i=1;i<=n;i++)
13       {
14         int a1;
15         scanf("%s",ch);
16         if(ch[0]!=‘P‘&&ch[0]!=‘N‘)
17           scanf("%d",&a1);
18         if(ch[0]==‘M‘)
19           now=a1;
20         if(ch[0]==‘I‘)
21           {
22             for(int i=0;i<a1;i++)
23               {
24                 ch1[i]=getchar();
25                 for(;ch1[i]==‘\n‘;ch1[i]=getchar());
26               }
27             ch1[a1]=0;
28             list.insert(now,ch1);
29            }
30         if(ch[0]==‘D‘)
31           list.erase(now,a1);
32         if(ch[0]==‘G‘)
33           {
34             list.copy(now,a1,ch1);
35             ch1[a1]=0;
36             printf("%s\n",ch1);
37           }
38         if(ch[0]==‘P‘)
39           now--;
40         if(ch[0]==‘N‘)
41           now++;
42       }
43     return 0;
44 }

本应是个平衡树,偷懒用了list。

时间: 2024-11-08 23:31:31

bzoj 1507: [NOI2003]Editor的相关文章

BZOJ 1507 NOI2003 Editor Splay

题目大意: 1.将光标移动到某一位置 2.在光标后插入一段字符串 3.删除光标后的一段字符 4.输出光标后的一段字符 5.光标-- 6.光标++ 和1269很像的一道题,不过弱多了 几个问题需要注意: 1.插入的字符串中间居然会有回车!!没办法了,只能逐个字符进行读入,一旦读到'\n'或者'\r'就重新读入 2.题目描述中说Delete和Get操作后面一定会有足够的字符 纯属放P 连样例都没有足够的字符用来删除 所以删除时要和字符串长度取一个最小值 然后就水水地过去了~ 30%达成 今天是不是可

BZOI 1507 [NOI2003] Editor

Background After trying to solve problem EDIT1(Editor) and being ****ed by Brainf**k, Blue Mary decided to set another difficult problem about editor. Description Some definations: Text: It's a sequence that consists characters whose ASCII code is in

1507: [NOI2003]Editor(块状链表)

1507: [NOI2003]Editor Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4157  Solved: 1677[Submit][Status][Discuss] Description Input 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中可能会插入一些回车符,请忽略掉它们(如果难以理解这句话,可以参考样例). 除了回车符之外,输入文件的所有字

BZOJ 1507 Editor

Description Input 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中可能会插入一些回车符,请忽略掉它们(如果难以理解这句话,可以参考样例). 除了回车符之外,输入文件的所有字符的ASCII码都在闭区间[32, 126]内.且行尾没有空格. 这里我们有如下假定:MOVE操作不超过50000个,INSERT和DELETE操作的总个数不超过4000,PREV和NEXT操作的总个数不超过200000.所有

BZOJ 1507 NOI 2003 Editor Splay

题目大意:维护一种数据结构,它可以: 1.移动光标 2.在光标之后插入一段字符串 3.删除光标之后的n个字符 4.输出光标之后的n个字符 5.移动光标 思路:Splay,没什么特别的.但是有几个需要注意的地方.1.题中说:delete操作不会越界.但是其实有可能会越界,比如样例就越界了.. 2.输出的时候一定不要偷懒.我刚开始写的时候就把输出写成nlogn输出的了,然后果断T了吗,我还以为是哪里死循环了,结果是这里被卡了!以后再也不偷懒随便加logn了... CODE: #include <cs

BZOJ1507 [NOI2003]Editor

AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1507 [分析] 据说打完维修数列,什么数据结构题都是浮云了...这题似乎就是一个简化版咯. 这题的要求都和字母的值无关,而是与字母在序列中的位置有关...所以应当用位置关系建树的方法啦[就是每次找第k个位置就是这个节点的左边有k-1个节点] 首先预处理出两个虚拟节点作为开头和结尾[这个也是区间操作的比较基础的哦...]. 每次的添加就是找到光标和光标的下一个组成的区间,然后接在下一个的左

BZOJ 1509 [NOI2003]逃学的小孩

题意:给定一棵树,设A, B, C为树上的三个不相同的点,求出max{dist(A, B) + min{dist(C, A), dist(C, B)}} 首先,如果dist(A,B)最大的话,很显然这是树上的一条最长链.也就是说,A和B是树上任意一条最长链的两个端点. 然后,我们有一个结论:树上某个点的最远点必定是树上任意一条最长链的两个端点中的一个.. 综合上面两个结论我们可以得到,当dist(A, B)和min{dist(C, A), dist(C, B)}同时取最大时,都与树上的最长链有关

BZOJ 1509: [NOI2003]逃学的小孩( 树形dp )

树形dp求出某个点的最长3条链a,b,c(a>=b>=c), 然后以这个点为交点的最优解一定是a+2b+c.好像还有一种做法是求出树的直径然后乱搞... --------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<cctype> using

[NOI2003]Editor(块状链表)

传送门 看了看块状链表,就是数组和链表的合体. 看上去好高大尚,思想也很简单. 但是发现代码量也不是很小,而且代码理解起来也是费尽得很,倒不如splay用起来顺手. 在加上适用范围貌似不是特别广,所以只把模板贴在这,只当了解思想,暂时先不使用.(也不会用啊) 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<queue> 5 using namespace std;