這些日子,可可不和卡卡一塊兒玩了,原來可可正廢寢忘食的想作一個簡單而高效的文本編輯器。你能幫助他嗎?爲了明確任務目標,可可對「文本編輯器」作了一個抽象的定義: 文本:由0個或多個字符構成的序列。這些字符的ASCII碼在閉區間[32, 126]內,也就是說,這些字符均爲可見字符或空格。光標:在一段文本中用於指示位置的標記,能夠位於文本的第一個字符以前,文本的最後一個字符以後或文本的某兩個相鄰字符之間。文本編輯器:爲一個能夠對一段文本和該文本中的一個光標進行以下七條操做的程序。若是這段文本爲空,咱們就說這個文本編輯器是空的。 編寫一個程序: 創建一個空的文本編輯器。 從輸入文件中讀入一些操做指令並執行。 對全部執行過的GET操做,將指定的內容寫入輸出文件。php
輸入文件中第一行是指令條數N,如下是須要執行的N個操做。除了回車符以外,輸入文件的全部字符的ASCII碼都在閉區間[32, 126]內。且行尾沒有空格。算法
依次對應輸入文件中每條GET指令的輸出,不得有任何多餘的字符。數據結構
對輸入數據咱們有以下假定: 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操做不會把光標移動到非法位置。 輸入文件沒有錯誤。編輯器
#include<cstdio>
#include<ext/rope>
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int N=2e6+5;
__gnu_cxx::crope a,b,exchange;
char s[10],str[N],rstr[N];
int now,n,len,size;
int main(){
for(n=read();n--;){
scanf("%s",s);
switch(s[0]){
case 'M':now=read();break;
case 'P':now--;break;
case 'N':now++;break;
case 'G':putchar(a[now]);putchar('\n');break;
case 'I':
size=read();len=a.length();
for(int i=0;i<size;i++){
do{
str[i]=getchar();
}while(str[i]=='\n');
rstr[size-i-1]=str[i];
}
str[size]=rstr[size]=0;
a.insert(now,str);
b.insert(len-now,rstr);
break;
case 'D':
size=read();len=a.length();
a.erase(now,size);
b.erase(len-now-size,size);
break;
case 'R':
size=read();len=a.length();
exchange=a.substr(now,size);
a=a.substr(0,now)+b.substr(len-now-size,size)+a.substr(now+size,len-now-size);
b=b.substr(0,len-now-size)+exchange+b.substr(len-now,now);
break;
}
}
return 0;
}