#P14855. [ICPC 2021 Yokohama R] Reversible Compression

    ID: 14772 远端评测题 2000ms 1024MiB 尝试: 0 已通过: 0 难度: 8 上传者: 标签>2021广度优先搜索 BFSICPC横浜

[ICPC 2021 Yokohama R] Reversible Compression

Description

数据压缩是我们信息社会中的一项关键技术。它旨在将给定的字符串编码成(最好是)更紧凑的代码字符串,以便高效存储和/或传输。

你需要设计一种新颖的压缩算法,使得即使代码字符串被 反转,也能解码成给定的字符串。

目前,你正在考虑以下规范作为一个候选方案。

  • 给定的字符串是一个十进制数字序列,即 0,1,2,3,4,5,6,7,8,0, 1, 2, 3, 4, 5, 6, 7, 8,99
  • 代码字符串是一个码字的序列,每个码字由两个十进制数字 AALL 组成。因此,代码字符串是一个由偶数个十进制数字组成的序列。
  • 代码字符串 A1L1AkLkA_1L_1 \cdots A_kL_k 通过以下过程解码为一个字符串。这里,为简洁起见,十进制数字(AiA_iLiL_i)也被视为其表示的单个十进制整数。
  1. i1i \leftarrow 1
  2. while (ii 不大于 kk) {
    3.  if (AiA_i 为零) { 输出 LiL_i }
    4.  else if (LiL_i 为零) { 不执行任何操作 }
    5.  else if (AiA_i 大于目前已输出的数字个数) { 引发错误 }
    6.  else {
    7.    重复 LiL_i 次 {
    8.      输出倒数第 AiA_i 个已输出的数字
    9.    }
    10.  }
    11.  ii+1i \leftarrow i + 1
  3. }

例如,代码字符串 0012500125 被解码为字符串 01010100101010,过程如下:

  1. 第一个码字 0000 输出 00
  2. 第二个码字 0101 输出 11
  3. 最后一个码字 2525 的第一个数字 22 表示应输出已解码数字中倒数第二个数字,并重复五次。第一次重复时,到目前为止解码的数字是 0011,因此倒数第二个数字是 00,将其输出。第二次重复时,到目前为止解码的数字是 0,1,0, 1,00,倒数第二个是 11,将其输出。再重复三次,输出 0,1,0, 1,00

不引发错误的码字序列是一个有效的代码字符串。如果一个有效的代码字符串的反转也是有效的,并且原始字符串及其反转都被解码成相同的字符串,则称该代码字符串是 可逆的

例如,代码字符串 0012500125 不是可逆的,因为它的反转 521000521000 会引发错误,因此无效。代码字符串 00100010 虽然其反转有效,但也不是可逆的。它被解码为 00,但其反转 01000100 被解码为 1010。另一方面,00155991000015599100 是可逆的,因为该字符串及其反转 00199551000019955100 都被解码为 00000000000000000000000000000000

你希望评估这种压缩方法在多种情况下的性能。你的任务是编写一个程序,对于任意给定的数字字符串,找出解码成给定字符串的最短可逆代码字符串。

Input Format

输入包含一行,是一个非空的十进制数字字符串 ssss 的长度不超过 500500

Output Format

输出解码成 ss 的最短可逆代码字符串。如果有多个相同最短长度的解决方案,则输出字典序最早的那个。注意,可以很容易证明对于任何输入字符串,总是存在一个可逆代码字符串(例如,参见样例输出 4)。

00000000000000000
0015599100
0101010 
000122221000
123123123123123123123123123123
01020336699993302010
123456789
010203040506070809908070605040302010