QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#751660 | #9536. Athlete Welcome Ceremony | PleaseHackme | ML | 0ms | 0kb | C++20 | 3.3kb | 2024-11-15 20:02:49 | 2024-11-15 20:02:49 |
Judging History
answer
#include <bits/stdc++.h>
using i64 = int64_t;
const int mod = 1e9 + 7;
void solve() {
int n, q;
std::cin >> n >> q;
std::string s;
std::cin >> s;
s = " " + s;
std::vector f(301, std::vector<std::vector<std::vector<int>>>(301, std::vector<std::vector<int>>(301, std::vector<int>(3))));
int cnt = 0;
for (int i = 1; i <= n; i ++) {
std::vector g(cnt + 1, std::vector<std::vector<std::vector<int>>>(cnt + 1, std::vector<std::vector<int>>(cnt + 1, std::vector<int>(3))));
if (s[i] == '?') {
if (i == 1) {
g[1][0][0][0] = 1;
g[0][1][0][1] = 1;
g[0][0][1][2] = 1;
} else {
for (int a = 0; a <= cnt; a ++) {
for (int b = 0; a + b <= cnt; b ++) {
int c = cnt - a - b;
if (c < 0) continue;
//? = a
g[a + 1][b][c][0] = (f[a][b][c][1] + f[a][b][c][2]) % mod;
//? = b
g[a][b + 1][c][1] = (f[a][b][c][0] + f[a][b][c][2]) % mod;
//? = c
g[a][b][c + 1][2] = (f[a][b][c][0] + f[a][b][c][1]) % mod;
}
}
}
} else {
if (i != 1) {
for (int a = 0; a <= cnt; a ++) {
for (int b = 0; a + b <= cnt; b ++) {
int c = cnt - a - b;
if (c < 0) continue;
if (s[i] == 'a') {
g[a][b][c][0] = (f[a][b][c][1] + f[a][b][c][2]) % mod;
} else if (s[i] == 'b') {
g[a][b][c][1] = (f[a][b][c][0] + f[a][b][c][2]) % mod;
} else {
g[a][b][c][2] = (f[a][b][c][0] + f[a][b][c][1]) % mod;
}
}
}
} else {
if (s[i] == 'a') g[0][0][0][0] = 1;
if (s[i] == 'b') g[0][0][0][1] = 1;
if (s[i] == 'c') g[0][0][0][2] = 1;
}
}
if (s[i] == '?') cnt ++;
f.swap(g);
}
std::vector ans(301, std::vector<std::vector<int>>(301, std::vector<int>(301)));
for (int i = 0; i <= cnt; i ++) {
for (int j = 0; i + j <= cnt; j ++) {
for (int k = 0; i + j + k <= cnt; k ++) {
ans[i][j][k] = (f[i][j][k][0] + f[i][j][k][1] + f[i][j][k][2]) % mod;
}
}
}
for (int i = 0; i <= 300; i++) {
for (int j = 0; j <= 300; j++) {
for (int k = 0; k <= 300; k++) {
if (i > 0) ans[i][j][k] += ans[i - 1][j][k];
ans[i][j][k] %= mod;
if (j > 0) ans[i][j][k] += ans[i][j - 1][k];
ans[i][j][k] %= mod;
if (k > 0) ans[i][j][k] += ans[i][j][k - 1];
ans[i][j][k] %= mod;
if (i && j) ans[i][j][k] += mod - ans[i - 1][j - 1][k];
ans[i][j][k] %= mod;
if (k && j) ans[i][j][k] += mod - ans[i][j - 1][k - 1];
ans[i][j][k] %= mod;
if (i && k) ans[i][j][k] += mod - ans[i - 1][j][k - 1];
ans[i][j][k] %= mod;
if (i && j && k) ans[i][j][k] += ans[i - 1][j - 1][k - 1];
ans[i][j][k] %= mod;
}
}
}
while (q --) {
int a, b, c;
std::cin >> a >> b >> c;
std::cout << (ans[a][b][c] + mod) % mod << "\n";
}
}
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t;
t = 1;
//std::cin >> t;
while (t--) {
solve();
}
return 0;
}
詳細信息
Test #1:
score: 0
Memory Limit Exceeded
input:
6 3 a?b??c 2 2 2 1 1 1 1 0 2