#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 开头的更长位串也不可。
  • 若某位串 ww 是某字符编码的前缀但不是完整编码,则 w0w0w1w1(即 ww 末尾添加 01)必为某些字符编码的前缀或完整编码。例如,若 0100 是字符 A 编码的前缀,则 0100001001 必须是某些字符编码的前缀或编码。

考虑以下针对字母表 A, B, C, D, E 的示例前缀编码:

字符 编码
A 00
B 10
C 11
D 010
E 011

使用前缀编码对字符序列编码是将各字符的编码依次拼接。例如,序列 BACAEBABAE 编码为 1000110001110001000011

Bajtazar 发现,若丢失若干初始位,解码可能出错或无法解码。例如,移除上述编码的前 55 位,剩余位串 10001110001000011 解码为 BACBABAE,后 55 位(BABAE)正确,但前 33 位(BAC)错误。他注意到,自首个 E 后所有字符均正确解码,推测只要 E 的编码位未丢失,其后字符均可正确解码。这一性质对任意含 E 的编码序列成立。字符 D 也具有此性质,但 A, B, C 没有。

Bajtazar 将字符 ED 的这一性质称为同步编码。他委托你编写程序,找出给定前缀编码中的所有同步编码。为节省时间,他决定在二进制显示屏上展示所有字符编码。显示屏有四个按钮:

  • 0:添加 0
  • 1:添加 1
  • B:退格,删除最后添加的数字。
  • X:按下发出哔声,表示当前显示的位串为一个字符编码。

初始显示屏为空,Bajtazar 按顺序操作按钮,每当显示屏上出现一个字符编码时按 X。展示最后一个编码后,他通过若干次 B 清空显示屏。你知道 Bajtazar 将展示完整前缀编码,使用最少的按钮次数。

输入格式

第一行包含一个整数 nn (6n3000000)(6 \leq n \leq 3000000),表示 Bajtazar 按下的按钮次数。下一行包含一个长度为 nn 的字符串,由字符 0,1,B,X 组成,表示按钮序列。每次按 X 表示一个新字符(字符从 11 编号)。所有编码总长度不超过 10810^8

输出格式

第一行输出一个整数 kk,表示同步编码的数目。接下来的 kk 行按升序输出同步编码对应字符的编号,每行一个。若无同步编码,仅输出一行包含 00

21
11XB0XBB00XB11XB0XBBB

2
4
5

Bajtazar 显示屏上依次出现的编码为:11, 10, 00, 011, 010。其中 011010 是同步编码。