QOJ.ac

QOJ

时间限制: 2 s 内存限制: 1024 MB 总分: 100

#3796. 可逆压缩

统计

数据压缩是我们信息社会中一项至关重要的技术。其目的是将给定的字符串编码为(最好是)更紧凑的代码字符串,以便能够高效地存储和/或传输。

你需要设计一种新颖的压缩算法,使得即使将代码字符串反转,它仍然可以被解码为原始字符串。

目前,你正在考虑将以下规范作为候选方案:

  • 给定的字符串是一个十进制数字序列,即 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 的过程如下:

  1. 第一个码字 00 输出 0。
  2. 第二个码字 01 输出 1。
  3. 最后一个码字 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

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.