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;
}

浙公网安备 33010602011771号