cf1426 F. Number of Subsequences

题意:

一个 abc 串,'?' 表示未确定。求所有可能串中 "abc" 子列的总数

思路:

把原串中的 '?' 都确定一下就能得到一个方案。

对每个 "abc" 子列,假设它用掉了 k 个 '?',原串中共有 cnt 个 '?',那么包含此子列的长度方案数就是 \(3^{cnt-k}\)

\(f(i,j=0\sim 3,k=0\sim j)\) 表示 i 或 i 之前,匹配了 "abc" 中的前 j 个,其中 k 个是从 '?' 变的 的方案数

可以压掉一维

ll n, cnt, ans, f[4][4]; //i或i之前,匹配了前j个,其中k个'?'
signed main() {
    iofast;
    cin >> n;
    for(int i = 1; i <= n; i++) {
        char c; cin >> c; cnt += c == '?';
        if(c == 'a')
            add(f[1][0], 1);
        else if(c == 'b')
            for(int k = 0; k <= 1; k++) add(f[2][k], f[1][k]);
        else if(c == 'c')
            for(int k = 0; k <= 2; k++) add(f[3][k], f[2][k]);
        else {
            for(int k = 1; k <= 3; k++) add(f[3][k], f[2][k-1]);
            for(int k = 1; k <= 2; k++) add(f[2][k], f[1][k-1]);
            add(f[1][1], 1);
        }
    }

    for(int i = 0; i <= 3; i++)
        add(ans, f[3][i] * qmi(3, cnt-i) % mod);
    cout << ans;
}
posted @ 2022-04-30 15:37  Bellala  阅读(34)  评论(0)    收藏  举报