这些日子,可可不和卡卡一块儿玩了,原来可可正废寝忘食的想作一个简单而高效的文本编辑器。你能帮助他吗?为了明确任务目标,可可对“文本编辑器”作了一个抽象的定义:
文本:由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;
}