QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#711029 | #9536. Athlete Welcome Ceremony | Kingdyw | WA | 91ms | 324424kb | C++23 | 4.5kb | 2024-11-04 23:52:40 | 2024-11-04 23:52:40 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define int long long
int read() {
int res = 0, flg = 1;
char c = getchar();
while(!isdigit(c)) {
if(c == '-') flg = 0;
c = getchar();
}
while(isdigit(c)) {
res = (res << 3) + (res << 1) + (c ^ 48);
c = getchar();
}
return flg ? res : -res;
}
const int N = 1e6 + 10, mod = 1e9 + 7;
inline int pls(int a, int b) {
int m = a + b;
return (m < mod) ? m : m - mod;
}
inline int dec(int a, int b) {
int m = a - b;
return (m < 0) ? m + mod : m;
}
int n, q;
int na, nb, nc;
int dp[2][4][155][155][155], now = 0, pre = 1;
int sum[2][4][155][155][155];
char s[N];
signed main() {
n = read(), q = read();
scanf("%s", s + 1);
int na, nb, nc;
na = nb = nc = 0;
int num = 0;
if(s[1] != '?') {
if(s[1] == 'a') dp[now][0][1][0][0] = 1, na++;
if(s[1] == 'b') dp[now][1][0][1][0] = 1, nb++;
if(s[1] == 'c') dp[now][2][0][0][1] = 1, nc++;
} else {
dp[now][0][1][0][0] = 1;
dp[now][1][0][1][0] = 1;
dp[now][2][0][0][1] = 1;
}
for(int i = 2; i <= n; ++i) {
swap(now, pre);
memset(dp[now], 0, sizeof(dp[now]));
if(s[i] == '?') {
for(int a = na; 2 * a <= i + 1; ++a) {
for(int b = nb; a + b < i && 2 * b <= i + 1; ++b) {
int c = i - 1 - a - b;
if(2 * c > i + 1 || c < nc) continue;
for(int last = 0; last < 3; ++last) {
if(last == 0) continue;
dp[now][0][a + 1][b][c] = pls(dp[now][0][a + 1][b][c], dp[pre][last][a][b][c]);
}
for(int last = 0; last < 3; ++last) {
if(last == 1) continue;
dp[now][1][a][b + 1][c] = pls(dp[now][1][a][b + 1][c], dp[pre][last][a][b][c]);
}
for(int last = 0; last < 3; ++last) {
if(last == 2) continue;
dp[now][2][a][b][c + 1] = pls(dp[now][2][a][b][c + 1], dp[pre][last][a][b][c]);
}
}
}
} else {
for(int a = na; a < i && 2 * a <= i + 1; ++a) {
for(int b = nb; a + b < i && 2 * b <= i + 1; ++b) {
int c = i - 1 - a - b;
if(2 * c > i + 1 || c < nc) continue;
for(int last = 0; last < 3; ++last) {
if(last == s[i] - 'a') continue;
if(s[i] - 'a' == 0) dp[now][0][a + 1][b][c] = pls(dp[now][0][a + 1][b][c], dp[pre][last][a][b][c]);
if(s[i] - 'a' == 1) dp[now][1][a][b + 1][c] = pls(dp[now][1][a][b + 1][c], dp[pre][last][a][b][c]);
if(s[i] - 'a' == 2) dp[now][2][a][b][c + 1] = pls(dp[now][2][a][b][c + 1], dp[pre][last][a][b][c]);
}
}
}
if(s[1] == 'a') na++;
if(s[1] == 'b') nb++;
if(s[1] == 'c') nc++;
}
}
//cout << i << '\n';
for(int i = 0; i < 3; ++i) {
for(int a = 0; a <= 150; ++a) {
for(int b = 0; b <= 150; ++b) {
for(int c = 0; c <= 150; ++c) {
sum[now][i][a][b][c] = dp[now][i][a][b][c];
if(a >= 1) sum[now][i][a][b][c] = pls(sum[now][i][a][b][c], sum[now][i][a - 1][b][c]);
if(b >= 1) sum[now][i][a][b][c] = pls(sum[now][i][a][b][c], sum[now][i][a][b - 1][c]);
if(c >= 1) sum[now][i][a][b][c] = pls(sum[now][i][a][b][c], sum[now][i][a][b][c - 1]);
if(a >= 1 && b >= 1) sum[now][i][a][b][c] = dec(sum[now][i][a][b][c], sum[now][i][a - 1][b - 1][c]);
if(a >= 1 && c >= 1) sum[now][i][a][b][c] = dec(sum[now][i][a][b][c], sum[now][i][a - 1][b][c - 1]);
if(b >= 1 && c >= 1) sum[now][i][a][b][c] = dec(sum[now][i][a][b][c], sum[now][i][a][b - 1][c - 1]);
if(a >= 1 && b >= 1 && c >= 1) sum[now][i][a][b][c] = pls(sum[now][i][a][b][c], sum[now][i][a - 1][b - 1][c - 1]);
}
}
}
}
// cout << dp[now][2][2][2][2] << '\n';
// cout << sum[now][2][2][2][2] << '\n';
// cout << sum[now][2][3][3][3] << '\n';
// n = read(), q = read();
// scanf("%s", s + 1);
// n = 300, q = 1e3;
//for(int i = 1; i <= 300; ++i) s[i] = '?';
int a, b, c;
for(int i = 1; i <= q; ++i) {
a = read(), b = read(), c = read();
a = min(150ll, a + na);
b = min(150ll, b + nb);
c = min(150ll, c + nc);
int res = 0;
for(int j = 0; j < 3; ++j) {
res = pls(res, sum[now][j][a][b][c]);
}
cout << res << '\n';
// memset(vis, 0, sizeof(vis));
// na = read(), nb = read(), nc = read();
//na = 300, nb = 300, nc = 300;
//cout << check(1, 3, 0, 0, 0) << '\n';
//clear(1, 3, 0, 0, 0);
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 91ms
memory: 324424kb
input:
6 3 a?b??c 2 2 2 1 1 1 1 0 2
output:
0 0 0
result:
wrong answer 1st lines differ - expected: '3', found: '0'