1932. 歪比巴卜

时间限制 1000 ms   内存限制 256 MB

在看了马老师饭堂一个月之后,饼老师成为了合格的谜语人并尝试和你进行加密通话。

饼老师会说出一串十六进制表示的数字序列,对于每一个数字,他都要使用一些编码规则对这个数字重新编码一次。现在饼老师向你发出了加密通话请求并且给了你一串加密过的谜语。为了简化问题,饼老师将每个数字加密后的谜语长度限制在 $3$ 字节以内。现在告诉你他用来加密的方法,你能不能翻译出来饼老师到底说了什么?

加密规则解释如下:

长度(字节) 加密模板(二进制表示) 位数
1 0xxxxxxx 7
2 110xxxxx 10xxxxxx 11
3 1110xxxx 10xxxxxx 10xxxxxx 16

表格的第一列表示加密后谜语的长度,第二列表示加密时使用的模板,第三列表示可以加密的位数

假如现在有一个数字 $V$ ,将它加密成 $k$ 字节的谜语的步骤如下:

  1. 将 $V$ 的二进制形式写出来;
  2. 选定一个长度 $k\ (k \leq 3)$;
  3. 如果 $V$ 的二进制格式的长度没有达到 $k$ 字节可以编码的位数,就在 $V$ 的二进制前补 $0$ ,直到长度相等;
  4. 从左到右(最高位到最低位),将 $V$ 的二进制表示依次插入到模板中 $x$ 的所在的位置。

举个例子,一个数字 $\rm 63H$ ,其二进制表示为 $1100011$,加密后有如下三个可能的值:

  • $01100011$ 即 $63$;
  • $11000001$ $10100011$ 即 $\rm C1\ A3$;
  • $11100000$ $10000001$ $10100011$ 即 $\rm E0\ 81\ A3$。

你或许需要

  • 数字后面带一个 $\rm H$,表示这个数字是以十六进制的格式给出;
  • scanf 中使用 %x 来输入十六进制数;
  • 十六进制数中 $\rm A$ 表示 $10$,$\rm B$ 表示 $11$,以此类推,直到 $\rm F$ 表示 $15$;
  • $1$ 字节$\rm (byte)$ = $8$ 位$\rm (bit)$。

输入数据

输入数据包括两行:
第一行为一个整数 $n\ (1\leq n\leq 1000)$ ,表示谜语的总字节数。
第二行为以空格分隔的 $n$ 个整数 $a_1, a_2, \dots, a_n\ ({\rm 01H} \leq a_i \leq {\rm FFH})$,每个整数都是一个十六进制的数字,含义在上面给出。

输出数据

输出数据包括两行:
第一行为一个整数 $len$ ,表示饼老师加密前的数字序列的长度。
第二行为 $len$ 个整数,每个整数表示一个加密前的数字,两个整数间以一个空格分隔。

样例输入

复制
2
C8 88 \n
  ·  \n

样例输出

复制
1
520 \n
   \n

提交

请先 登录

© 2024 FAQs Contact About