数据压缩是我们信息社会中一项至关重要的技术。其目的是将给定的字符串编码为(最好是)更紧凑的代码字符串,以便能够高效地存储和/或传输。
你需要设计一种新颖的压缩算法,使得即使将代码字符串反转,它仍然可以被解码为原始字符串。
目前,你正在考虑将以下规范作为候选方案:
- 给定的字符串是一个十进制数字序列,即 0, 1, 2, 3, 4, 5, 6, 7, 8 和 9。
- 代码字符串是一个码字序列,每个码字由两个十进制数字 $A$ 和 $L$ 组成。因此,代码字符串是一个长度为偶数的十进制数字序列。
代码字符串 $A_1L_1 \dots A_kL_k$ 通过以下过程解码为字符串。为简洁起见,十进制数字($A_i$ 或 $L_i$)也被视为其所代表的单位十进制整数。
$i \leftarrow 1$
- while ($i$ 不大于 $k$) {
- if ($A_i$ 为零) { 输出 $L_i$ }
- else if ($L_i$ 为零) { 什么都不做 }
- else if ($A_i$ 大于目前已输出的数字个数) { 报错 }
- else {
- 重复 $L_i$ 次 {
- 输出已输出数字中倒数第 $A_i$ 个数字
- }
- }
- $i \leftarrow i + 1$
- }
例如,代码字符串 000125 解码为字符串 0101010 的过程如下:
- 第一个码字 00 输出 0。
- 第二个码字 01 输出 1。
- 最后一个码字 25 的第一个数字 2 表示应输出已解码数字中倒数第二个数字。此操作应重复五次。第一次重复时,目前已解码的数字为 0 和 1,因此倒数第二个数字是 0,将其输出。第二次重复时,已解码的数字为 0, 1 和 0,倒数第二个数字是 1,将其输出。再重复三次,输出 0, 1 和 0。
不报错的码字序列称为有效的代码字符串。如果一个有效的代码字符串的反转也是有效的,且原始代码字符串和反转后的代码字符串都能解码为相同的字符串,则称该代码字符串是可逆的。
例如,代码字符串 000125 是不可逆的,因为它的反转 521000 会报错,因此不是有效的。代码字符串 0010 虽然其反转是有效的,但它也不是可逆的。它解码为 0,但其反转 0100 解码为 10。另一方面,0015599100 是可逆的,因为该字符串及其反转 0019955100 都解码为 00000000000000000。
你希望评估该压缩方法在各种情况下的性能。你的任务是编写一个程序,对于任意给定的数字字符串,找到解码后为该字符串的最短可逆代码字符串。
输入格式
输入包含一行,为一个非空的十进制数字字符串 $s$。$s$ 的长度不超过 500。
输出格式
输出解码后为 $s$ 的最短可逆代码字符串。如果存在多个长度相同的最短解,则输出字典序最小的一个。注意,对于任何输入字符串,总是存在可逆代码字符串(例如,参见样例输出 4)。
样例
样例输入 1
00000000000000000
样例输出 1
0015599100
样例输入 2
0101010
样例输出 2
000122221000
样例输入 3
123123123123123123123123123123
样例输出 3
01020336699993302010
样例输入 4
123456789
样例输出 4
010203040506070809908070605040302010