题目译自 BalticOI 2015 Day1 Editor(EDI),原题面见附加文件。
如欲转载翻译,请注明翻译者信息及转载出处。
Byteasar 是一个致力于编写革命性的文本编辑器的程序员。这个编辑器有两种操作,一种操作允许在编辑器中编辑文本,另一种允许撤销之前的操作。这个文本编辑器的一个创新特性是支持多级撤销操作。它如下工作。我们称文本编辑操作是 $0$ 级操作。一个 $i$ 级的撤销操作(对于 $i=1,2,\cdots$)可以撤销最后一次级别最多为 $i-1$ 且没有被撤销的操作。例如,一个级别为 $1$ 的撤销操作只能撤销文本编辑操作,一个级别为 $2$ 的撤销操作能撤销文本编辑操作和级别为 $1$ 的撤销操作(但是不能撤销级别更高的操作了)。
更正式的,每一个已经出现的操作有两个状态:活动(active)或已撤销(undone)。设 $X$ 为一个操作。只有完成操作 $X$ 之后,它才处于活动状态。如果 $X$ 是一个 $i$ 级撤销操作,我们就要找到最近的一次处于活动状态的,最多为级别 $i-1$ 的操作(用 $X_1$ 表示),并把它(即 $X_1$)的状态变为已撤销。如果 $X_1$ 也是一个撤销操作,我们必须把 $X_1$ 撤销了的操作的状态变为活动(用 $X_2$ 表示)。我们用相同的方式继续操作:无论何时我们撤销了之前撤销过 $X_{j+1}$ 的操作 $X_j$,我们必须改变 $X_{j+1}$ 操作的状态(当然,这将导致更多操作的状态变化)。整个状态修改链结束于一个编辑操作。
简单起见,目前编辑器中文本的内容用一个整数 $s$ 来表示,我们称之为编辑器状态(初始等于 $0$)。每一个编辑操作决定了它产生的编辑器状态。编辑器状态取决于最后一个活动的编辑操作。请帮助 Byteasar 写一个程序跟踪编辑器状态。
让我们在操作中理解这一过程:下表展示了一些 Byteasar 进行的操作和在操作之后的编辑器状态。$\text{E}_s$ 表示一个把编辑器状态变为 $s$ 的编辑操作,$\text{U}_i$ 表示级别为 $i$ 的撤销操作。
| 操作 |
|
$\text{E}_1$ |
$\text{E}_2$ |
$\text{E}_5$ |
$\text{U}_1$ |
$\text{U}_1$ |
$\text{U}_3$ |
$\text{E}_4$ |
$\text{U}_2$ |
$\text{U}_1$ |
$\text{U}_1$ |
$\text{E}_1$ |
| 编辑器状态 |
$0$ |
$1$ |
$2$ |
$5$ |
$2$ |
$1$ |
$2$ |
$4$ |
$2$ |
$1$ |
$0$ |
$1$ |
首先,Byteasar 进行了三个编辑操作。编辑器状态从 $0$ 变成 $1$,然后变成 $2$,最后变成 $5$。然后,它进行了两次级别为 $1$ 的撤销操作,撤销了操作 $\text{E}_5$ 和 $\text{E}_2$(把它们的状态变为已撤销)。所以编辑器状态还原为 $1$。接下来的级别为 $3$ 的撤销操作撤销了最后的操作 $\text{U}_1$(把它的状态变为已撤销),结果还原了操作 $\text{E}_2$(把它的状态还原为活动)。结果编辑器状态回到了 $2$。操作 $\text{U}_2$ 撤销了操作 $\text{E}_4$,操作 $\text{U}_1$ 又一次撤销已被还原的操作 $\text{E}_2$,最后的操作 $\text{U}_1$ 撤销了操作 $\text{E}_1$,并且最后的操作是 $\text{E}_1$。