P14855 [ICPC 2021 Yokohama R] Reversible Compression
题目描述
数据压缩是我们信息社会中的一项关键技术。它旨在将给定的字符串编码成(最好是)更紧凑的代码字符串,以便高效存储和/或传输。
你需要设计一种新颖的压缩算法,使得即使代码字符串被 **反转**,也能解码成给定的字符串。
目前,你正在考虑以下规范作为一个候选方案。
- 给定的字符串是一个十进制数字序列,即 $0, 1, 2, 3, 4, 5, 6, 7, 8,$ 和 $9$。
- 代码字符串是一个码字的序列,每个码字由两个十进制数字 $A$ 和 $L$ 组成。因此,代码字符串是一个由偶数个十进制数字组成的序列。
- 代码字符串 $A_1L_1 \cdots A_kL_k$ 通过以下过程解码为一个字符串。这里,为简洁起见,十进制数字($A_i$ 或 $L_i$)也被视为其表示的单个十进制整数。
1. $i \leftarrow 1$
2. while ($i$ 不大于 $k$) {
3. if ($A_i$ 为零) { 输出 $L_i$ }
4. else if ($L_i$ 为零) { 不执行任何操作 }
5. else if ($A_i$ 大于目前已输出的数字个数) { 引发错误 }
6. else {
7. 重复 $L_i$ 次 {
8. 输出倒数第 $A_i$ 个已输出的数字
9. }
10. }
11. $i \leftarrow i + 1$
12. }
例如,代码字符串 $00125$ 被解码为字符串 $0101010$,过程如下:
1. 第一个码字 $00$ 输出 $0$。
2. 第二个码字 $01$ 输出 $1$。
3. 最后一个码字 $25$ 的第一个数字 $2$ 表示应输出已解码数字中倒数第二个数字,并重复五次。第一次重复时,到目前为止解码的数字是 $0$ 和 $1$,因此倒数第二个数字是 $0$,将其输出。第二次重复时,到目前为止解码的数字是 $0, 1,$ 和 $0$,倒数第二个是 $1$,将其输出。再重复三次,输出 $0, 1,$ 和 $0$。
不引发错误的码字序列是一个有效的代码字符串。如果一个有效的代码字符串的反转也是有效的,并且原始字符串及其反转都被解码成相同的字符串,则称该代码字符串是 **可逆的**。
例如,代码字符串 $00125$ 不是可逆的,因为它的反转 $521000$ 会引发错误,因此无效。代码字符串 $0010$ 虽然其反转有效,但也不是可逆的。它被解码为 $0$,但其反转 $0100$ 被解码为 $10$。另一方面,$0015599100$ 是可逆的,因为该字符串及其反转 $0019955100$ 都被解码为 $0000000000000000$。
你希望评估这种压缩方法在多种情况下的性能。你的任务是编写一个程序,对于任意给定的数字字符串,找出解码成给定字符串的最短可逆代码字符串。
输入格式
输入包含一行,是一个非空的十进制数字字符串 $s$。$s$ 的长度不超过 $500$。
输出格式
输出解码成 $s$ 的最短可逆代码字符串。如果有多个相同最短长度的解决方案,则输出字典序最早的那个。注意,可以很容易证明对于任何输入字符串,总是存在一个可逆代码字符串(例如,参见样例输出 4)。