#HK5109. 「POI2009 R3」编码 The Code
「POI2009 R3」编码 The Code
题目描述
题目译自 XVI OI Olimpiada Informatyczna – III etap Kod
拜托西亚电信研究所(BIT)负责制定拜托西亚电信网络的数据传输标准。Bajtazar 是 BIT 的计算机科学家,专注于前缀编码——一种特殊的字符表示方法。拜托西亚字母表中的每个字符对应一个位串,称为该字符的编码。这些编码具有以下特性:
- 任一字符的编码不是其他字符编码的前缀。例如,若字符
A的编码为010010,则0, 01, 010, 0100, 01001均不可为其他字符的编码,同样,0100100, 0100101及以010010开头的更长位串也不可。 - 若某位串 是某字符编码的前缀但不是完整编码,则 和 (即 末尾添加
0或1)必为某些字符编码的前缀或完整编码。例如,若0100是字符A编码的前缀,则01000和01001必须是某些字符编码的前缀或编码。
考虑以下针对字母表 A, B, C, D, E 的示例前缀编码:
| 字符 | 编码 |
|---|---|
A |
00 |
B |
10 |
C |
11 |
D |
010 |
E |
011 |
使用前缀编码对字符序列编码是将各字符的编码依次拼接。例如,序列 BACAEBABAE 编码为 1000110001110001000011。
Bajtazar 发现,若丢失若干初始位,解码可能出错或无法解码。例如,移除上述编码的前 位,剩余位串 10001110001000011 解码为 BACBABAE,后 位(BABAE)正确,但前 位(BAC)错误。他注意到,自首个 E 后所有字符均正确解码,推测只要 E 的编码位未丢失,其后字符均可正确解码。这一性质对任意含 E 的编码序列成立。字符 D 也具有此性质,但 A, B, C 没有。
Bajtazar 将字符 E 和 D 的这一性质称为同步编码。他委托你编写程序,找出给定前缀编码中的所有同步编码。为节省时间,他决定在二进制显示屏上展示所有字符编码。显示屏有四个按钮:
0:添加0。1:添加1。B:退格,删除最后添加的数字。X:按下发出哔声,表示当前显示的位串为一个字符编码。
初始显示屏为空,Bajtazar 按顺序操作按钮,每当显示屏上出现一个字符编码时按 X。展示最后一个编码后,他通过若干次 B 清空显示屏。你知道 Bajtazar 将展示完整前缀编码,使用最少的按钮次数。
输入格式
第一行包含一个整数 ,表示 Bajtazar 按下的按钮次数。下一行包含一个长度为 的字符串,由字符 0,1,B,X 组成,表示按钮序列。每次按 X 表示一个新字符(字符从 编号)。所有编码总长度不超过 。
输出格式
第一行输出一个整数 ,表示同步编码的数目。接下来的 行按升序输出同步编码对应字符的编号,每行一个。若无同步编码,仅输出一行包含 。
21
11XB0XBB00XB11XB0XBBB
2
4
5
Bajtazar 显示屏上依次出现的编码为:11, 10, 00, 011, 010。其中 011 和 010 是同步编码。