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


    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 5269  Solved: 2037
    [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

    鸣谢seter重新制作数据

    rope大法好!

    rope大法好!

    rope大法好!

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<ext/rope>
     5 using namespace std;
     6 using namespace __gnu_cxx;
     7 
     8 rope<char> a,b,t;
     9 int n,pos,k,len;
    10 char ch[10],s[2000000],str[2000000];
    11 
    12 int main()
    13 {
    14     scanf("%d",&n);
    15     for(int i=1;i<=n;i++)
    16     {
    17         scanf("%s",ch);
    18         switch(ch[0])
    19         {
    20             case 'M':
    21                 scanf("%d",&pos);
    22                 break;
    23             case 'I':
    24                 scanf("%d",&k);
    25                 len=a.length();
    26                 for(int i=0;i<k;i++)
    27                 {
    28                     s[i]=getchar();
    29                     while(s[i]=='
    ')
    30                         s[i]=getchar();
    31                     str[k-i-1]=s[i];
    32                 }
    33                 str[k]=s[k]=0;
    34                 a.insert(pos,s);
    35                 b.insert(len-pos,str);
    36                 break;
    37             case 'D':
    38                 scanf("%d",&k);
    39                 len=a.length();
    40                 a.erase(pos,k);
    41                 b.erase(len-pos-k,k);
    42                 break;
    43             case 'R':
    44                 scanf("%d",&k);
    45                 len=a.length();
    46                 t=a.substr(pos,k);
    47                 a=a.substr(0,pos)+b.substr(len-pos-k,k)+a.substr(pos+k,len-pos-k);
    48                 b=b.substr(0,len-pos-k)+t+b.substr(len-pos,pos);
    49                 break;
    50             case 'G':
    51                 printf("%c
    ",a[pos]);
    52                 break;
    53             case 'P':
    54                 pos--;
    55                 break;
    56             case 'N':
    57                 pos++;
    58                 break;
    59         }
    60     }
    61     return 0;
    62 }
  • 相关阅读:
    C# 读取 vCard 格式
    C#自动选择出系统中最合适的IP地址
    WPF专业编程指南
    WPF专业编程指南
    随手复习一下委托:delegate
    迟到的 WPF 学习 —— 控件
    迟到的 WPF 学习 —— 路由事件
    迟到的 WPF 学习 —— 依赖项属性
    迟到的 WPF 学习 —— 布局
    JavaScript 左右上下自动晃动,自动移动。
  • 原文地址:https://www.cnblogs.com/InWILL/p/9693719.html
Copyright © 2020-2023  润新知