本题要求我们为包含占位符 ? 的符文序列(由 0/1/? 构成)进行填充,使得最终的完整序列满足:每一个极长同属性段(连续且不能向两端扩展的相同属性符文组成的子串)的长度均为奇数。求所有合法填充方案的总数,结果对 109+7 取模。
由于序列只包含 0 和 1 两种属性,我们可以使用动态规划,从左到右扫描序列,维护当前最后一个极长同属性段的状态。对于当前已经处理的前缀,我们只关心以下两种信息:
c(c=0 表示阴,c=1 表示阳),且该段的当前长度为奇数,此时的方案数记为 odd[c];c,且该段的当前长度为偶数,此时的方案数记为 even[c]。考古学家发掘出一段古老的符文序列,每个符文固定为两种基本属性之一:阳(记为 1)或阴(记为 0)。由于风化侵蚀,部分符文已经无法辨认,位置被替换为占位符 ?。你需要将每一个 ? 独立地替换为 0 或 1,从而恢复出一段完整的序列。
我们定义序列的一个 极长同属性段 为一段连续且不能向两端扩展的相同属性符文组成的子串。恢复后的序列必须满足:每一个极长同属性段的长度都是奇数。请计算所有可能的合法填充方案总数。
由于答案可能很大,结果需要对 109+7 取模。
约束条件
第一行包含一个整数 T,表示测试数据的组数。接下来依次给出每组数据:第一行包含一个整数 n,表示符文序列的长度;第二行包含一个长度为 n 且仅由字符 0、1、? 组成的字符串,表示原始的受损序列。
对于每组测试数据,输出一行一个整数,表示满足条件的填充方案数,结果对 109+7 取模。
输入
1
1
?
输出
2
说明
序列仅包含 1 个字符 ?,可以独立替换为 0 或 1。无论哪种选择,最终的序列都只包含一个极长同属性段,长度为 1,是奇数。因此共有 2 种合法方案。
输入
1
3
1?1
输出
2
说明
已知序列为 1?1,中间的 ? 有两种填法:
0:得到 101,极长段依次为 1、0、1,长度均为 1(奇数),合法。1:得到 111,只有一个极长段 111,长度为 3(奇数),合法。两种填充均满足要求,方案总数为 2。
输入
1
3
0?1
输出
0
说明
序列为 0?1,考虑 ? 的两种可能:
0,得到 001,极长段 00 的长度为 2(偶数),不满足奇数要求。1,得到 011,极长段 11 的长度为 2(偶数),同样不合法。无论哪种选择都会产生偶数长度的极长段,因此不存在合法方案,答案为 0。
输入
1
5
0??0?
输出
2
说明
序列包含 3 个 ?,可以通过动态规划计算合法方案。所有合法填充共有 2 种,例如:
0,得到 00000,唯一极长段长度为 5(奇数),合法。01000,极长段依次为 0(长度 1)、1(长度 1)、000(长度 3),均为奇数。其余填充方式(如 00100、01100 等)均会产生偶数长度的极长段,故总方案数为 2。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.