这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器。你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义: 文本:由0个或多个字符构成的序列。这些字符的ASCII码在闭区间[32, 126]内,也就是说,这些字符均为可见字符或空格。光标:在一段文本中用于指示位置的标记,可以位于文本的第一个字符之前,文本的最后一个字符之后或文本的某两个相邻字符之间。文本编辑器:为一个可以对一段文本和该文本中的一个光标进行如下七条操作的程序。如果这段文本为空,我们就说这个文本编辑器是空的。 编写一个程序: 建立一个空的文本编辑器。 从输入文件中读入一些操作指令并执行。 对所有执行过的GET操作,将指定的内容写入输出文件。
/--------------------------------------------------------------------------------------------------------------------------------------------------------------/
就想看看rope怎么搞的。代码来自https://www.cnblogs.com/keshuqi/p/6257642.html好神奇,时间复杂度好像高了点。。
#include<cstdio>
#include<ext/rope>
#include<iostream>
using namespace std;
using namespace __gnu_cxx;
inline int Rin()
{
int x=0,c=getchar(),f=1;
for(;c<48||c>57;c=getchar())
if(!(c^45))
f=-1;
for(;c>47&&c<58;c=getchar())
x=(x<<1)+(x<<3)+c-48;
return x*f;
}
int n,pos,x,l;
rope<char>a,b,tmp;
char sign[10],ch[1<<22],rch[1<<22];
int main()
{
n=Rin();
while(n--)
{
scanf("%s",sign);
switch(sign[0])
{
case'M':
pos=Rin();
break;
case'P':
pos--;
break;
case'N':
pos++;
break;
case'G':
putchar(a[pos]);
putchar('\n');
break;
case'I':
x=Rin();
l=a.length();
for(int i=0;i<x;i++)
{
do{
ch[i]=getchar();
}while(ch[i]=='\n');
rch[x-i-1]=ch[i];
}
ch[x]=rch[x]='\0';
a.insert(pos,ch);
b.insert(l-pos,rch);
break;
case'D':
x=Rin();
l=a.length();
a.erase(pos,x);
b.erase(l-pos-x,x);
break;
case'R':
x=Rin();
l=a.length();
tmp=a.substr(pos,x);
a=a.substr(0,pos)+b.substr(l-pos-x,x)+a.substr(pos+x,l-pos-x);
b=b.substr(0,l-pos-x)+tmp+b.substr(l-pos,pos);
break;
}
}
return 0;
}