bzoj1269 [AHOI2006]文本编辑器editor(伸展树??rope)

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值