3610: 编码-训练套题T5T3
Description
3. 编码(compare.pas)
【问题描述】
我们准备根据一份文本编码表对一篇文本进行压缩。编码表的每一项包含两个部分:要编码的字符串和对应的编码。编码是二进制的01串,用来替代文本中相应的字符串以实现压缩编码的目的。这些01串不一定是等长的。文本压缩所要考虑的问题是对给定的文本和编码表,求出能令整个文本的编码最短的二进制串的长度。例如文本:abcdef
编码表
字符串 |
a |
abc |
abcd |
bcd |
def |
ef |
编码 |
01 |
0 |
1011 |
1 |
10 |
11 |
下面有3种不同的方式进行编码:
方式1:长度为5
a |
bcd |
ef |
01 |
1 |
11 |
方式2:长度为3
abc |
def |
0 |
10 |
方式3:长度为6
abcd |
ef |
1011 |
11 |
很明显,方式2长度最短,你的任务是找出编码后文本的最短长度,若不能进行编码,则输出0.
【输入文件】
输入可能包含多个文本压缩问题。
第一行是一个整数n,表示有n个文本压缩问题。(n<=10)
每个文本压缩问题的描述第一行是要压缩的文本(不超过210个字符),接下来是编码表,每项一行,不超过100项,只包含小写字母,外侧有小括号。
【输出文件】
对应每个文本压缩问题,每行输出一个最小长度
【样例输入】
2
abcdef
(a,01)
(abc,0)
(abcd,1011)
(bcd,1)
(def,10)
(ef,11)
aa
(a,1)
(ab,10)
【样例输出】
3
2
HINT
Dp:
f[i]表示前i个字符编码的最小长度
f[i]=min{f[k]+a[k+1..i]} 其中 a[k+1..i]表示从第K+1 到i的字符编码的长度, a[k+1..i]必须能被一次编码,
故需要预处理出以i结尾的所有编码。