#B4369. [语言月赛 202507] LZW 压缩
[语言月赛 202507] LZW 压缩
题目描述
LZW 压缩是一种非常著名且广泛使用的无损数据压缩算法。
以下是 LZW 压缩算法的流程:
- 给定一个输入字符串 和初始字典,设字符串 为空串。
- 获取 中未被遍历的第一个字符 :
- 若 (加号表示字符串连接)存在于字典中,则令 ,重复执行第 2 步。
- 否则,将 添加到字典 ,其对应的编码为 中元素的个数加一。输出 代表的编码,令 ,重复执行第 2 步。
- 最后,输出 代表的编码。
:在本题中,字典 是一个结构体数组。其中,每个结构体内存储了两个变量 ,意为正整数编码 可以代表字符串 。
例如,对字符串 ABABABA
进行 LZW 压缩的流程如下:
初始字典 :。
是否在 中 | 输出 | 新增字典条目 | 更新为 | |||
---|---|---|---|---|---|---|
空串 | A |
是 | A |
|||
A |
B |
AB |
否 | B |
||
B |
A |
BA |
A |
|||
A |
B |
AB |
是 | AB |
||
AB |
A |
ABA |
否 | A |
||
A |
B |
AB |
是 | AB |
||
AB |
A |
ABA |
ABA |
|||
ABA |
结束 |
则 ABABABA
的 LZW 压缩结果为 1 2 3 5
。
现给出字符串 和初始字典 ,请对 进行 LZW 压缩,并输出执行完 LZW 压缩后的字典。
输入格式
第一行输入三个整数 ,表示字符串 的长度、初始字典 的大小,且字符集为前 个大写英文字母。
接下来 行,每行输入一个字符串,表示字典中的一个条目,输入的第 个字符串对应的编号为 。保证前 个大写英文字母一定在字典中出现,且这 个条目一定是前 个给出的。
接下来一行一个字符串 。
输出格式
第一行输出若干个由空格分隔的正整数,表示 经 LZW 压缩后的结果。
第二行输出一行一个正整数 ,表示字典 的大小。
接下来 行,每一行输出一个字符串,表示字典 的各个条目。你应当按编号从小到大的顺序输出,即你输出的第 个字符串对应的编号应为 。
7 2 2
A
B
ABABABA
1 2 3 5
5
A
B
AB
BA
ABA
25 1 1
A
AAAAAAAAAAAAAAAAAAAAAAAAA
1 2 3 4 5 6 4
7
A
AA
AAA
AAAA
AAAAA
AAAAAA
AAAAAAA
19 6 6
A
B
C
D
E
F
ACBECDFCAACBECDACBE
1 3 2 5 3 4 6 3 1 7 9 11 16 5
19
A
B
C
D
E
F
AC
CB
BE
EC
CD
DF
FC
CA
AA
ACB
BEC
CDA
ACBE
提示
样例 1 解释
此样例即为题目描述中的例子。
注意在输出字典的条目时,需要将输入的字典条目一并输出。
样例 2 解释
此样例满足特殊性质 AB。
数据范围与约定
对于全部数据,满足 。 中所有字符串的长度总和不超过 ,且 中没有重复的字符串。保证前 个大写英文字母一定在字典中出现,且这 个条目分别使用编码 。各测试点的详细数据范围见下表。
测试点 | 特殊性质 | |
---|---|---|
A | ||
无 | ||
B | ||
C | ||
无 | ||
特殊性质 A:保证 。
特殊性质 B:保证 。
特殊性质 C:保证字符串 为随机生成。