输 入文件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秒。ios
输出文件editor.out的每行依次对应输入文件中每条GET指令的输出。测试
1 #include<iostream> 2 #include<cstdio> 3 #include<ext/rope> 4 using namespace std; 5 using namespace __gnu_cxx;//没太懂 6 crope list; 7 char ch[3000005]; 8 int t,now; 9 int main(){ 10 scanf("%d",&t); 11 while (t--){ 12 char s[10];int x; 13 scanf("%s",s); 14 switch(s[0]){ 15 case 'M':scanf("%d",&now);break; 16 case 'P':now--;break; 17 case 'N':now++;break; 18 case 'I': 19 scanf("%d",&x); 20 for (int i=0;i<x;i++){ 21 ch[i]=getchar(); 22 while(ch[i]=='\n')ch[i]=getchar(); 23 ch[x]=0; 24 } 25 list.insert(now,ch); 26 break; 27 case 'D':scanf("%d",&x);list.erase(now,x);break; 28 case 'G':scanf("%d",&x);list.copy(now,x,ch);ch[x]=0;puts(ch); 29 } 30 } 31 }