QOJ.ac

QOJ

実行時間制限: 3 s メモリ制限: 64 MB 満点: 100

#598. 代码

統計

Byteotian Institute of Telecommunication (BIT) 为 Byteotia 的所有电信网络制定了数据传输标准。BIT 的工程师 Byteasar 正在研究前缀码——一种表示字符的特定方式。Byteotian 字母表中的每个字符都对应一个位序列,称为该字符的码字。所有字符的码字具有以下性质:

  • 没有任何一个码字是另一个码字的前缀(即引导片段)。例如,如果 010010 是字母 A 的码字,那么位序列 0、01、010、0100 或 01001 都不是其他字母的码字。同样,0100100、0100101 以及以 010010 开头的更长序列也不是码字。
  • 如果给定的位序列 $w$ 是另一个码字的前缀,但不是完整的码字,那么位序列 $w_0$ 和 $w_1$(即在 $w$ 末尾分别添加 0 或 1)要么是某个码字的前缀,要么是完整的码字。例如,如果 0100 是字母 A 码字的前缀,那么 01000 和 01001 要么是某个码字的前缀,要么是完整的码字。

考虑以下由字符 A、B、C、D 和 E 组成的字母表的前缀码示例:

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

使用前缀码对字符序列进行编码,即将连续字符的码字连接起来。例如,序列 BACAEBABAE 的编码为 1000110001110001000011。

Byteasar 注意到,如果丢失了一些前导位,序列可能会被错误解码,甚至根本无法解码。例如,如果删除了上述序列的前五位,得到的序列 10001110001000011 将被解码为 BACBABAE。最后五个字母 (BABAE) 是正确的,但前三个 (BAC) 不正确。Byteasar 进一步注意到,第一个 E 之后的所有字母都被正确解码了。他得出结论:只要 E 的码字的所有位都完整,E 之后的所有字符都将被正确解码。对于包含 E 的任何编码序列,情况也是如此。他还注意到字母 D 也具有此特征,但 A、B 和 C 没有。

由于 E 和 D 的码字具有这些属性,Byteasar 将它们称为同步码字。他委托你编写一个程序,找出给定前缀码的所有同步码字。为了节省时间,他打算在二进制监视器上向你展示所有码字。这个有趣的设备有四个按钮:

  • 0 - 追加 0
  • 1 - 追加 1
  • B - 退格;删除最后一位数字
  • X - 蜂鸣!按下此按钮时监视器会发出蜂鸣声。

最初显示屏是空的;Byteasar 通过按下按钮输入连续的码字,当屏幕上出现一个完整的码字时,Byteasar 按下 X。在向你展示最后一个码字后,Byteasar 通过多次按下 B 清除屏幕。他声明他将以最少的按键次数向你展示完整的前缀码。

输入

标准输入的第一行包含一个整数 $n$ ($6 ≤ n ≤ 3\,000\,000$),表示 Byteasar 按下的按钮次数。接下来的行给出了一个长度为 $n$ 的字符串,由字符 '0'、'1'、'B' 和 'X' 组成;这些字符对应于按钮。每次按下按钮 X,一个码字就完成,另一个码字开始。码字从 1 开始编号。所有码字长度之和不超过 $10^8$。

输出

第一行应输出同步码字的个数 $k$。接下来的 $k$ 行应按升序输出同步码字的编号,每行一个。如果给定的前缀码不包含同步码字,则第一行应包含数字 0,且不再输出后续行。

样例

输入格式 1

21
11XB0XBB00XB11XB0XBBB

输出格式 1

2
4
5

说明

Byteasar 的监视器上依次出现的码字为:11, 10, 00, 011, 010。其中,011 和 010 是同步码字。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.