1269: [AHOI2006]文本编辑器editor

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 5269  Solved: 2037
[Submit][Status][Discuss]

Description

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

Input

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

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操做不会把光标移动到非法位置。 输入文件没有错误。spa

 

Source

鸣谢seter从新制做数据code

 

rope大法好!blog

rope大法好!ip

rope大法好!get

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<ext/rope>
 5 using namespace std;
 6 using namespace __gnu_cxx;
 7 
 8 rope<char> a,b,t;
 9 int n,pos,k,len;
10 char ch[10],s[2000000],str[2000000];
11 
12 int main()
13 {
14     scanf("%d",&n);
15     for(int i=1;i<=n;i++)
16     {
17         scanf("%s",ch);
18         switch(ch[0])
19         {
20             case 'M':
21                 scanf("%d",&pos);
22                 break;
23             case 'I':
24                 scanf("%d",&k);
25                 len=a.length();
26                 for(int i=0;i<k;i++)
27                 {
28                     s[i]=getchar();
29                     while(s[i]=='\n')
30                         s[i]=getchar();
31                     str[k-i-1]=s[i];
32                 }
33                 str[k]=s[k]=0;
34                 a.insert(pos,s);
35                 b.insert(len-pos,str);
36                 break;
37             case 'D':
38                 scanf("%d",&k);
39                 len=a.length();
40                 a.erase(pos,k);
41                 b.erase(len-pos-k,k);
42                 break;
43             case 'R':
44                 scanf("%d",&k);
45                 len=a.length();
46                 t=a.substr(pos,k);
47                 a=a.substr(0,pos)+b.substr(len-pos-k,k)+a.substr(pos+k,len-pos-k);
48                 b=b.substr(0,len-pos-k)+t+b.substr(len-pos,pos);
49                 break;
50             case 'G':
51                 printf("%c\n",a[pos]);
52                 break;
53             case 'P':
54                 pos--;
55                 break;
56             case 'N':
57                 pos++;
58                 break;
59         }
60     }
61     return 0;
62 }
相关文章
相关标签/搜索