#P14855. [ICPC 2021 Yokohama R] Reversible Compression

[ICPC 2021 Yokohama R] Reversible Compression

题目描述

Data compression is an essential technology in our information society. It is to encode a given string into a (preferably) more compact code string so that it can be stored and/or transferred efficiently.

You are asked to design a novel compression algorithm such that even a code string is reversed it can be decoded into the given string.

Currently, you are considering the following specification as a candidate.

  • A given string is a sequence of decimal digits, namely, 0,1,2,3,4,5,6,7,8,0, 1, 2, 3, 4, 5, 6, 7, 8, and 99.
  • A code string is a sequence of code words, and a code word consists of two decimal digits AA and LL. So, a code string is a sequence of even number of decimal digits.
  • A code string A1L1AkLkA_1L_1 \cdots A_kL_k is decoded into a string by the following procedure. Here, for brevity, a decimal digit (AiA_i or LiL_i) is also treated as the single digit decimal integer it represents.
  1. i1i \leftarrow 1
  2. while (ii is not greater than kk) {
    3.  if (AiA_i is zero) { output LiL_i }
    4.  else if (LiL_i is zero) { do nothing }
    5.  else if (AiA_i is larger than the number of digits output so far) { raise an error }
    6.  else {
    7.    repeat LiL_i times {
    8.      output the AiA_i-th of the already output digits counted backwards
    9.    }
    10.  }
    11.  ii+1i \leftarrow i + 1
  3. }

For example, a code string 0012500125 is decoded into a string 01010100101010 as follows:

  1. The first code word 0000 outputs 00.
  2. The second code word 0101 outputs 11.
  3. The first digit 22 of the last code word 2525 means that the second digit in the already decoded digits, counted backwards, should be output. This should be repeated five times. For the first repetition, the decoded digits so far are 00 and 11, and thus the second last digit is 00, which is output. For the second repetition, digits decoded so far are 0,1,0, 1, and 00, and the second last is 11, which is output. Repeating this three more times outputs 0,1,0, 1, and 00.

A sequence of code words that raises no error is a valid code string. A valid code string is said to be reversible when its reverse is also valid and both the original and its reverse are decoded into the same string.

For example, the code string 0012500125 is not reversible, because its reverse, 521000521000, raises an error and thus is not valid. The code string 00100010 is not reversible though its reverse is valid. It is decoded into 00, but its reverse 01000100 is decoded into 1010. On the other hand, 00155991000015599100 is reversible, because this and its reverse, 00199551000019955100, are both decoded into 00000000000000000000000000000000.

You want to evaluate the performance of this compression method when applied to a variety of cases. Your task is to write a program that, for an arbitrary given digit string, finds the shortest reversible code string that is decoded into the given string.

输入格式

The input consists of a single line containing a non-empty string ss of decimal digits. The length of ss does not exceed 500500.

输出格式

Output the shortest reversible code string that is decoded into ss. If there are multiple solutions with the same shortest length, output the earliest in the lexicographic order. Note that it is easily shown that a reversible code string always exists for any input string (e.g., see Sample Output 4).

00000000000000000
0015599100
0101010 
000122221000
123123123123123123123123123123
01020336699993302010
123456789
010203040506070809908070605040302010