• 1269: [AHOI2006]文本编辑器editor


    1269: [AHOI2006]文本编辑器editor

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 3835  Solved: 1449
    [Submit][Status][Discuss]

    Description

    这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器。你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义:   文本:由0个或多个字符构成的序列。这些字符的ASCII码在闭区间[32, 126]内,也就是说,这些字符均为可见字符或空格。光标:在一段文本中用于指示位置的标记,可以位于文本的第一个字符之前,文本的最后一个字符之后或文本的某两个相邻字符之间。文本编辑器:为一个可以对一段文本和该文本中的一个光标进行如下七条操作的程序。如果这段文本为空,我们就说这个文本编辑器是空的。 编写一个程序: 建立一个空的文本编辑器。 从输入文件中读入一些操作指令并执行。 对所有执行过的GET操作,将指定的内容写入输出文件。

    Input

    输入文件中第一行是指令条数N,以下是需要执行的N个操作。除了回车符之外,输入文件的所有字符的ASCII码都在闭区间[32, 126]内。且行尾没有空格。

    Output

    依次对应输入文件中每条GET指令的输出,不得有任何多余的字符。

    Sample Input

    10
    Insert 13
    Balanced eert
    Move 2
    Delete 5
    Next
    Insert 7
    editor
    Move 0
    Get
    Move 11
    Rotate 4
    Get

    Sample Output

    B
    t

    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

    设计数据结构支持

    插入删除反转字符串

    #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('
    ');break;
                case 'I':
                        size=read();len=a.length();
                        for(int i=0;i<size;i++){
                            do{
                                str[i]=getchar();
                            }while(str[i]=='
    ');
                            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;
    }
  • 相关阅读:
    利用余数选择特殊位置元素
    CSS hack
    css选择器
    按yyyy-mm-dd格式输入一个日期,判断这是这一年的第几天
    输入不同year,month,打印月历
    java学习之多线程(二)
    java学习之多线程
    剑指offer--第一个只出现一次的字符
    剑指offer--两个链表的第一个公共结点
    剑指offer--最小的k个数
  • 原文地址:https://www.cnblogs.com/shenben/p/6367201.html
Copyright © 2020-2023  润新知