#HK5415. 「OOI 2018 Day 1」斑马

「OOI 2018 Day 1」斑马

题目描述

题目译自 Open Olympiad in Informatics 2018 Day1 T1 「Зебры / Zebras

奥列格记录了他生活中每一天的经历,将每一天标记为好日子或坏日子。奥列格将一种非空的日子序列定义为“斑马”,该序列必须以坏日子开始和结束,并且好日子和坏日子交替出现。我们用 00 表示坏日子,用 11 表示好日子。例如,日子序列 000100100101001010 都是斑马,而序列 110110011001010101 则不是。

奥列格以字符串形式按时间顺序向你提供了他的日子记录,字符串由字符 0011 组成。现在,你需要判断是否可以将奥列格的日子记录拆分为若干个子序列,使得每个子序列都是一个斑马。如果可以拆分,你需要给出一种拆分方案。每个日子必须且只能属于一个子序列。每个子序列中的日子必须按时间顺序排列。注意,子序列不一定是由连续的日子组成的。

输入格式

输入数据只有一行,包含一个非空字符串 ss,由字符 0011 组成,表示奥列格的日子记录。字符串的长度(以下简称 s|s|)不超过 200000200000 个字符。

输出格式

如果可以将日子记录拆分为若干个斑马子序列,则在第一行输出一个整数 kk (1ks)(1 \leq k \leq |s|),表示拆分得到的子序列数量。接下来在 kk 行中,第 ii 行首先输出一个整数 lil_i (1lis)(1 \leq l_i \leq |s|),表示第 ii 个子序列的长度,然后输出 lil_i 个整数,表示组成该子序列的日子在记录中的编号。编号必须按升序排列,从 11 开始。每个从 11s|s| 的编号必须且只能出现在一个子序列中。如果无法拆分为斑马子序列,则输出 1-1

子序列可以按任意顺序输出。如果存在多种可能的拆分方式,可以输出任意一种。无需最小化或最大化 kk 的值。

0010100

3
3 1 3 4
3 2 5 6
1 7

111

-1

数据范围与提示

详细子任务附加限制及分值如下表所示。其中子任务 00 是样例。

子任务 分值 附加限制 备注
11 3131 s10\vert s\vert \leq 10
22 2929 s2000\vert s\vert \leq 2000
33 4040