题解 | #Balanced 01-String#

Balanced 01-String

https://ac.nowcoder.com/acm/problem/311835

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10, mod = 998244353;
char s[N];
int f[N][2][2]; // f[i][j][k]为考虑前i个字符, 相邻两个元素相同的对数奇偶性为j, 且第i个元素为k的方案数
int main() {
    int T;
    cin >> T;
    while (T --) {
        scanf("%s", s + 1);
        int n = strlen(s + 1);
        memset(f, 0, sizeof f);
        if (s[1] == '0') f[1][0][0] = 1;
        else if (s[1] == '1') f[1][0][1] = 1;
        else f[1][0][0] = f[1][0][1] = 1;
        for (int i = 2; i <= n; i ++) {
            if (s[i] == '0') {
                f[i][0][0] = (f[i - 1][0][1] + f[i - 1][1][0]) % mod;
                f[i][1][0] = (f[i - 1][1][1] + f[i - 1][0][0]) % mod;
            } else if (s[i] == '1') {
                f[i][0][1] = (f[i - 1][0][0] + f[i - 1][1][1]) % mod;
                f[i][1][1] = (f[i - 1][1][0] + f[i - 1][0][1]) % mod;
            } else {
                f[i][0][0] = (f[i - 1][0][1] + f[i - 1][1][0]) % mod;
                f[i][1][0] = (f[i - 1][1][1] + f[i - 1][0][0]) % mod;
                f[i][0][1] = (f[i - 1][0][0] + f[i - 1][1][1]) % mod;
                f[i][1][1] = (f[i - 1][1][0] + f[i - 1][0][1]) % mod;
            }
        }
        printf("%d\n", (f[n][0][0] + f[n][0][1]) % mod);
    }
    return 0;
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务