luogu#P2631. Barcodes
Barcodes
题目背景
code-11 是一种条形码编码系统,用来将一个字符串编码为条形码。
题目描述
在这种编码系统中
可以使用的字符仅有数字0 到9 以及"-"号,以及特殊的start/stop 字符放在条形码的开头
和结尾。对于每个字符,都对应了一个长度为5 的01 串如下所示,对应到条形码中,每个
条形码都是由黑白相隔的条带组成的,且第一个条带为黑色。条带分为宽和窄两种,宽带的宽度为窄带的两倍,0 表示窄的,1 表示宽的条带。
character Encoding
0 00001
1 10001
2 01001
3 11000
4 00101
5 10100
6 01100
7 00011
8 10010
9 10000
-
00100
Start/Stop 00110
而每两个相邻的字符之间一定是一个白色窄带作为分隔。
为了能够检测条形码的正确性,我们加入两个检测数字C 和K,加在条形码的末尾(在
stop 之前)。设需编码的字符串为c1...cn,则C 为:
n ( ∑ ((n-i)mod 10 +1)*w(ci)) mod 11
i=1
K 为:
n+1 ( ∑ ((n-i)mod 10 +1)*w(ci)) mod 11
i=1
而cn+1 即为C。其中w(ci)为每个字符的权重。0 到9 即为0 到9。"-"为10。
举个例子,对于字符串123-45,C 和K 分别等于5 和2,则条形码为123-4552,并在前
后加上start 和stop 符号。
在实际应用中,通过探测器探测出每个条带的宽度后,通过解析软件将条形码还原为原本的字符串。
由于条形码方向并未固定,所以软件必须自己判断这个条形码是从左至右的还是从右至左的。 现在,你的任务是扫描并解析一个条形码。你所拥有的信息为每个条带的宽度,但由于设备总是会有误差的,所以,宽带宽度不一定严格的是窄带的宽度的两倍,你的程序需要能够容忍5%的误差。
输入格式
由于输出的特殊情况较多,所以采用多组测试数据。 输入第一行包括一个整数T表示测试数据的组数,对于每组数据首先是一个整数n表示该条形码有多少条带。接着n个整数d1..dn以空格隔开表示了每个条带的宽度。再次强调你并不知道这个条形码是从左至右的还是从右至左的,你需要正着和反着都判断一遍。 T <= 20, n <= 150, di<=200。
输出格式
对于每组数据输出一行。 输出时分如下几种情况。若该条形码合法,则输出解析所得的原字符串,不包括检测字符C和K。若可以成功解析但是检测字符C错了,则输出"bad C"。若C也是对的,但K是错的,则输出"bad K"。对于剩下所有情况输出bad code。
3
59
10 20 20 10 10 10 20 10 10 20 10 10 10 10 20 10 20 10 10 10 20 10 20 10 20 10 20 10 10 10 10 10 20 10 10 10 10 10 10 20 20 10 20 10 10 20 10 10 20 10 10 10 20 10 10 20 20 10 10
35
10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
35
10 10 20 20 10 10 20 10 10 10 20 10 10 20 10 10 20 10 10 10 20 10 20 10 20 10 10 10 10 10 10 10 20 20 10
123-45
bad code
bad K
提示
注意A相对于B误差<=%5是指|A-B|/B<=5% 本题是指宽带相对于窄带。