A16686 | Left is Always Right
时间限制1s
内存限制256MB
通过 / 提交0/0
题目描述
给定一个长度为 $n$ 的二进制字符串和一个奇数 $k$。如果对于该字符串的每一个长度为 $k$ 的子串,其最左侧的字符出现的次数比其他字符多,则称该二进制字符串是好的。
例如,当 $k=3$ 时,字符串 000101 是好的,因为所有长度为 $3$ 的子串(000、001、010 和 101)中,子串最左侧的字符出现次数都多于另一种字符。相反,1011 不是好字符串,因为子串 011 不满足该性质。
现在给定一个长度为 $n$ 的模式串,包含字符 0、1 或 ?。请你计算将所有 ? 替换为 0 或 1,使得所得二进制字符串为好字符串的方案数。由于答案可能很大,请对 $998\,244\,353$ 取模后输出。
例如,当 $k=3$ 时,字符串 000101 是好的,因为所有长度为 $3$ 的子串(000、001、010 和 101)中,子串最左侧的字符出现次数都多于另一种字符。相反,1011 不是好字符串,因为子串 011 不满足该性质。
现在给定一个长度为 $n$ 的模式串,包含字符 0、1 或 ?。请你计算将所有 ? 替换为 0 或 1,使得所得二进制字符串为好字符串的方案数。由于答案可能很大,请对 $998\,244\,353$ 取模后输出。
输入格式
每个测试点包含多组测试数据。第一行包含一个整数 $t$($1 \le t \le 10^3$),表示测试数据的组数。
每组测试数据的第一行包含两个整数 $n$ 和 $k$($3 \le k \le n \le 10^5$,$k$ 为奇数)。第二行包含 $n$ 个字符 0、1 或 ?,组成的模式串。
保证所有测试数据中 $n$ 的总和不超过 $10^5$。
每组测试数据的第一行包含两个整数 $n$ 和 $k$($3 \le k \le n \le 10^5$,$k$ 为奇数)。第二行包含 $n$ 个字符 0、1 或 ?,组成的模式串。
保证所有测试数据中 $n$ 的总和不超过 $10^5$。
输出格式
对于每组测试数据,输出一个整数,表示将所有 ? 替换为 0 或 1,使得所得字符串为好字符串的方案数,对 $998\,244\,353$ 取模后输出。
输入输出样例
输入 #1
3 5 3 0??0? 7 7 1??1??1 9 5 ?????????
输出 #1
3 15 46
在第一个样例中,将模式串变成好字符串的三种方法是 00000、00001 和 00101。
在第二个样例中,16 种可能的方案中只有 1001001 是不合法的。
在第二个样例中,16 种可能的方案中只有 1001001 是不合法的。
C++ 编辑器
输入
输出
可保存默认模板;新题优先使用已保存模板。
当前快捷键仅展示,暂不支持修改。
- 撤销
Ctrl / ⌘ + Z - 重做
Ctrl / ⌘ + Y - 查找
Ctrl / ⌘ + F - 全选
Ctrl / ⌘ + A - 复制
Ctrl / ⌘ + C - 剪切
Ctrl / ⌘ + X - 粘贴
Ctrl / ⌘ + V - 自动排版
工具栏排版按钮 - 草稿保存
编辑时自动保存到本机
历史
提交记录
状态说明时间源码
AI
作答助手
你好,我是作答助手。可以问思路、复杂度、样例含义或代码报错原因;不会直接给出完整 AC 代码。
确定要清空代码吗?