Median Replace

· · 题解

Median Replace

题意

题解

考虑如何判断一个 0/1 串是否合法。

维护一个栈,这个栈从栈底到栈顶由一段连续的 1 和一段连续的 0 组成。

对于一个新加字符 c

根据这个过程可以知道栈 0/1 的个数只有 0 \sim 2 这三种,总共只有 9 种情况。

考虑根据这个判定方法进行 DP,时间复杂度 \mathcal O(n)

代码

const int N = 3e5 + 7;
int n;
char s[N];
modint f[N][3][3], ans;

int main() {
    rds(s, n), f[0][0][0] = 1;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < 3; j++)
            for (int k = 0; k < 3; k++)
                if (!!f[i][j][k]) {
                    if (s[i+1] != '0') {
                        if (k) f[i+1][j][k-1] += f[i][j][k];
                        else f[i+1][min(j+1,2)][k] += f[i][j][k];
                    }
                    if (s[i+1] != '1') {
                        if (k == 2) f[i+1][j][1] += f[i][j][k];
                        else f[i+1][j][k+1] += f[i][j][k];
                    }
                }
    for (int i = 0; i < 3; i++)
        for (int j = 0; j <= i; j++)
            ans += f[n][i][j];
    print(ans);
    return 0;
}