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)。