将问题抽象为:给定一个长度为 m 的字符串 pat,其中每个字符可能是小写字母或 ?。要求将每个 ? 替换为小写字母,使得最终序列中任意相邻两个字符不相同。求总方案数对 109+7 取模的结果。
采用动态规划,逐位处理。由于字符集只有 26 个小写字母,可以维护一个长度为 26 的数组 f[c],表示当前处理到的前缀中,以字符 c(c=0,1,…,25)结尾的合法方案数。
在一种古老的珠宝镶嵌工艺中,工匠需要设计一条由 m 颗宝石串成的手链。每颗宝石的颜色用一个英文小写字母表示(\texttt{a} 到 \texttt{z})。工艺要求相邻两颗宝石的颜色必须不同。
工匠拿到了一份设计草图,草图上有些位置已经指定了颜色(即一个小写字母),有些位置标为 exttt{?} 表示尚未指定,可以由工匠自由选择颜色。
请你计算:在所有完全遵循草图(非 exttt{?} 位必须使用对应颜色, exttt{?} 位可任意选择)且满足相邻颜色不同的方案中,一共有多少种可能的手链颜色序列?
由于答案可能很大,需要对 109+7 取模后输出。
整数 T 满足 1≤T≤1000。每组字符串长度 m 满足 1≤m≤105,且所有 m 之和不超过 5×105。
第一行包含一个整数 T,表示数据组数。 接下来依次描述每组数据:
每组数据第一行包含一个整数 m,表示序列长度。 第二行包含一个长度为 m 的字符串,仅由小写字母和字符 exttt{?} 构成,表示草图上的颜色标记。
对于每组数据,输出一行一个整数,表示满足条件的颜色序列数量对 109+7 取模的结果。
输入
1
1
?
输出
26
说明
当手链只有 1 颗宝石时,不存在相邻位置,因此任何字母都满足要求。
草图 ? 表示可以自由选择 a 到 z 中的任意一个小写字母,共有 26 种方案。
所以答案为 26。
输入
2
3
???
3
abb
输出
16250
0
说明
第一组数据 ???,长度为 3:
1 位可以任选 26 种字母;2 位不能与第 1 位相同,有 25 种选择;3 位不能与第 2 位相同,也有 25 种选择。
总方案数为 26×25×25=16250。第二组数据 abb,长度为 3:
第 2 位与第 3 位固定为 b 和 b,它们是相邻位置且颜色相同,违反了工艺中相邻颜色不同的要求。
因此不存在合法方案,答案为 0。
输入
2
4
a??a
3
a?a
输出
600
25
说明
第一组数据 a??a,长度为 4,首尾固定为 a:
1 位固定为 a,只有 1 种;2 位是 ?,不能是 a,有 25 种可选字母;3 位是 ?,不能与第 2 位相同,也不能与第 4 位的 a 相同。由于第 2 位已经不能是 a,因此第 3 位需要排除 2 个不同的字母,剩余 24 种选择;4 位固定为 a,前述约束已保证满足。
总方案数为 1×25×24=600。第二组数据 a?a,长度为 3,首尾固定为 a:
1 位固定为 a;2 位是 ?,不能是 a,有 25 种选择;3 位固定为 a,只需与第 2 位不同。因为第 2 位已不是 a,所有 25 种选择都满足要求。
总方案数为 25。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册