1269: [AHOI2006]文本編輯器editor
阿新 • • 發佈:2018-09-23
http sci ++ () time esc mil nbsp names Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 5269 Solved: 2037
[Submit][Status][Discuss]
Insert 13
Balanced eert
Move 2
Delete 5
Next
Insert 7
editor
Move 0
Get
Move 11
Rotate 4
Get
t
Submit: 5269 Solved: 2037
[Submit][Status][Discuss]
Description
這些日子,可可不和卡卡一起玩了,原來可可正廢寢忘食的想做一個簡單而高效的文本編輯器。你能幫助他嗎?為了明確任務目標,可可對“文本編輯器”做了一個抽象的定義: 文本:由0個或多個字符構成的序列。這些字符的ASCII碼在閉區間[32, 126]內,也就是說,這些字符均為可見字符或空格。光標:在一段文本中用於指示位置的標記,可以位於文本的第一個字符之前,文本的最後一個字符之後或文本的某兩個相鄰字符之間。文本編輯器:為一個可以對一段文本和該文本中的一個光標進行如下七條操作的程序。如果這段文本為空,我們就說這個文本編輯器是空的。 編寫一個程序:? 建立一個空的文本編輯器。? 從輸入文件中讀入一些操作指令並執行。? 對所有執行過的GET操作,將指定的內容寫入輸出文件。
Input
輸入文件中第一行是指令條數N,以下是需要執行的N個操作。除了回車符之外,輸入文件的所有字符的ASCII碼都在閉區間[32, 126]內。且行尾沒有空格。
Output
依次對應輸入文件中每條GET指令的輸出,不得有任何多余的字符。
Sample Input
10Insert 13
Balanced eert
Move 2
Delete 5
Next
Insert 7
editor
Move 0
Get
Move 11
Rotate 4
Get
Sample Output
Bt
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操作不會把光標移動到非法位置。? 輸入文件沒有錯誤。
Source
鳴謝seter重新制作數據
rope大法好!
rope大法好!
rope大法好!
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 }
1269: [AHOI2006]文本編輯器editor