QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#702858 | #9536. Athlete Welcome Ceremony | ucup-team4975# | WA | 2ms | 18072kb | C++23 | 3.6kb | 2024-11-02 16:41:45 | 2024-11-02 16:41:46 |
Judging History
answer
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 305;
const int P = 1000000007;
int f[N][N][N]
[3]; // 到第i位,恰好用了j个a;用了k个b用了i-j-k个c,最后一位恰好用。。。
string s;
int n, q;
int S[N][N], S1[N][N], S2[N][N]; // i a j b
int a[N][N];
int numa, numb, numc;
signed main()
{
cin >> n >> q;
cin >> s;
s = " " + s;
for (int i = 1; i <= n; i++) {
if (s[i] == 'a')
numa++;
if (s[i] == 'b')
numb++;
if (s[i] == 'c')
numc++;
}
if (s[1] == 'a') {
f[1][1][0][0] = 1;
}
else if (s[1] == 'b') {
f[1][0][1][1] = 1;
}
else if (s[1] == 'c') {
f[1][0][0][2] = 1;
}
else {
f[1][1][0][0] = f[1][0][1][1] = f[1][0][0][2] = 1;
}
for (int i = 2; i <= n; i++) {
for (int j = 0; j <= i; j++)
for (int k = 0; k <= i - j; k++) {
if (j >= 1)
f[i][j][k][0] =
(f[i - 1][j - 1][k][1] + f[i - 1][j - 1][k][2]) % P;
if (k >= 1)
f[i][j][k][1] =
(f[i - 1][j][k - 1][0] + f[i - 1][j][k - 1][2]) % P;
if (i - j - k >= 1)
f[i][j][k][2] = (f[i - 1][j][k][0] + f[i - 1][j][k][1]) % P;
if (s[i] == 'a') {
f[i][j][k][1] = f[i][j][k][2] = 0;
}
else if (s[i] == 'b') {
f[i][j][k][0] = f[i][j][k][2] = 0;
}
else if (s[i] == 'c') {
f[i][j][k][0] = f[i][j][k][1] = 0;
}
}
}
/*for (int j = 0; j <= n; j++)
for (int k = 0; k <= n - j; k++) {
cout << j << " " << k << " " << n - j - k << " " << f[n][j][k][0]
<< " " << f[n][j][k][1] << " " << f[n][j][k][2] << endl;
}*/
for (int i = 0; i <= n; i++)
for (int j = 0; j <= n; j++)
a[i][j] = (f[n][i][j][0] + f[n][i][j][1] + f[n][i][j][2]) % P;
S[0][0] = 0;
for (int i = 1; i <= n; i++)
S[i][0] = (S[i - 1][0] + a[i][0]) % P;
for (int i = 1; i <= n; i++)
S[0][i] = (S[0][i - 1] + a[0][i]) % P;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
S[i][j] =
(S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1] + P + a[i][j]) % P;
for (int i = 0; i <= n; i++)
for (int j = 1; j <= n - i + 1; j++)
for (int k = 0; k <= j - 1; k++)
if (i + k == 0)
S1[i][j] = (S1[i][j] + S[i + k][j - 1 - k] + P) % P;
else
S1[i][j] = (S1[i][j] + S[i + k][j - 1 - k] -
S[i + k - 1][j - 1 - k] + P) %
P;
for (int i = 0; i <= n; i++)
for (int j = 1; j <= n - i + 1; j++)
for (int k = 0; k <= j - 1; k++)
if (i + k == 0)
S2[i][j] = (S2[i][j] + S[j - 1 - k][i + k] + P) % P;
else
S2[i][j] = (S2[i][j] + S[j - 1 - k][i + k] -
S[j - 1 - k][i + k - 1] + P) %
P;
while (q--) {
int a, b, c;
scanf("%lld%lld%lld", &a, &b, &c);
// x<=a
// y<=b
// x+y>=n-c
a += numa;
b += numb;
c += numc;
if (a > n)
a = n;
if (b > n)
b = n;
if (c > n)
c = n;
int ans;
if (a >= b) {
if (n - c > a + b)
ans = 0;
else if (n - c > a)
ans = S[a][b] - S1[0][n - c] + S1[a + 1][n - c - a - 1] +
S2[b + 1][n - c - b - 1];
else if (n - c > b)
ans = S[a][b] - S[n - b - c - 1][b] - S1[n - b - c][b];
else if (n - c > 0)
ans = S[a][b] - S1[0][n - c];
else
ans = S[a][b];
}
else if (a < b) {
if (n - c > a + b)
ans = 0;
else if (n - c > b)
ans = S[a][b] - S1[0][n - c] + S2[b + 1][n - c - b - 1] +
S2[a + 1][n - c - a - 1];
else if (n - c > a)
ans = S[a][b] - S[a][n - a - c - 1] - S2[n - a - c][a];
else if (n - c > 0)
ans = S[a][b] - S1[0][n - c];
else
ans = S[a][b];
}
ans = (ans % P + P) % P;
printf("%lld\n",ans);
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 18072kb
input:
6 3 a?b??c 2 2 2 1 1 1 1 0 2
output:
3 1 1
result:
ok 3 lines
Test #2:
score: 0
Accepted
time: 2ms
memory: 18072kb
input:
6 3 ?????? 2 2 2 2 3 3 3 3 3
output:
30 72 96
result:
ok 3 lines
Test #3:
score: -100
Wrong Answer
time: 1ms
memory: 7868kb
input:
1 1 ? 0 1 1
output:
1
result:
wrong answer 1st lines differ - expected: '2', found: '1'