#D. [NOI2003] 文本编辑器

    Type: RemoteJudge 1000ms 125MiB

[NOI2003] 文本编辑器

You cannot submit for this problem because the contest is ended. You can click "Open in Problem Set" to view this problem in normal mode.

题目描述

很久很久以前,DOS3.xDOS3.x 的程序员们开始对 EDLINEDLIN 感到厌倦。于是,人们开始纷纷改用自己写的文本编辑器⋯⋯

多年之后,出于偶然的机会,小明找到了当时的一个编辑软件。进行了一些简单的测试后,小明惊奇地发现:那个软件每秒能够进行上万次编辑操作(当然,你不能手工进行这样的测试) !于是,小明废寝忘食地想做一个同样的东西出来。你能帮助他吗?

为了明确目标,小明对“文本编辑器”做了一个抽象的定义:

文本:由 00 个或多个 ASCII 码在闭区间 [3232, 126126] 内的字符构成的序列。

光标:在一段文本中用于指示位置的标记,可以位于文本首部,文本尾部或文本的某两个字符之间。

文本编辑器:由一段文本和该文本中的一个光标组成的,支持如下操作的数据结构。如果这段文本为空,我们就说这个文本编辑器是空的。

操作名称 输入文件中的格式 功能
Move(k)\text{Move}(k) Move k 将光标移动到第 kk 个字符之后,如果 k=0k=0,将光标移到文本开头
Insert(n,s)\text{Insert}(n,s) Insert n s 在光标处插入长度为 nn 的字符串 ss,光标位置不变n1n\geq1
Delete(n)\text{Delete}(n) Delete n 删除光标后的 nn 个字符,光标位置不变,n1n \geq 1
Get(n)\text{Get}(n) Get n 输出光标后的 nn 个字符,光标位置不变,n1n \geq 1
Prev()\text{Prev}() Prev 光标前移一个字符
Next()\text{Next}() Next 光标后移一个字符

你的任务是:

  • 建立一个空的文本编辑器。

  • 从输入文件中读入一些操作并执行。

  • 对所有执行过的 GET 操作,将指定的内容写入输出文件。

输入格式

输入文件 editor.in 的第一行是指令条数 tt,以下是需要执行的 tt 个操作。其中:

为了使输入文件便于阅读, Insert 操作的字符串中可能会插入一些回车符, 请忽略掉它们(如果难以理解这句话,可以参照样例) 。

除了回车符之外,输入文件的所有字符的 ASCII 码都在闭区间 [3232, 126126] 内。且

行尾没有空格。

这里我们有如下假定:

  • MOVE 操作不超过 5000050000 个, INSERTDELETE 操作的总个数不超过 40004000PREVNEXT 操作的总个数不超过 200000200000

  • 所有 INSERT 插入的字符数之和不超过 2M2M1M=1024×10241M=1024\times 1024 字节) ,正确的输出文件长度不超过 3M3M 字节。

  • DELETE 操作和 GET 操作执行时光标后必然有足够的字符。 MOVEPREVNEXT 操作必然不会试图把光标移动到非法位置。

  • 输入文件没有错误。

对 C++ 选手的提示:经测试,最大的测试数据使用 fstream 进行输入有可能会比使用 stdio 慢约 11 秒。

输出格式

输出文件 editor.out 的每行依次对应输入文件中每条 Get 指令的输出。

15
Insert 26
abcdefghijklmnop
qrstuv wxy
Move 15
Delete 11
Move 5
Insert 1
^
Next
Insert 1
_
Next
Next
Insert 4
.\/.
Get 4
Prev
Insert 1
^
Move 0
Get 22


.\/.
abcde^_^f.\/.ghijklmno

ch07 - 平衡树

Not Claimed
Status
Done
Problem
8
Open Since
2023-12-23 0:00
Deadline
2024-3-3 23:59
Extension
2400 hour(s)