BZOJ 1507 [NOI2003]Editor

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秒。ios

Output

輸出文件editor.out的每行依次對應輸入文件中每條GET指令的輸出。測試

Sample Input

15
Insert 26
abcdefghijklmnop
qrstuv wxy
Move 15
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
 
認識了一個特別牛的庫,#include<ext/rope>,裏面有好多東西。。。慢慢研究
 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 }
相關文章
相關標籤/搜索