QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#703366 | #9536. Athlete Welcome Ceremony | ucup-team4975# | WA | 78ms | 116596kb | C++17 | 3.6kb | 2024-11-02 17:39:38 | 2024-11-02 17:39:38 |
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 <= 300; i++)
for (int j = 0; j <= 300; j++)
a[i][j] = (f[n][i][j][0] + f[n][i][j][1] + f[n][i][j][2]) % P;
S[0][0] = a[0][0];
for (int i = 1; i <= 300; i++)
S[i][0] = (S[i - 1][0] + a[i][0]) % P;
for (int i = 1; i <= 300; i++)
S[0][i] = (S[0][i - 1] + a[0][i]) % P;
for (int i = 1; i <= 300; i++)
for (int j = 1; j <= 300; j++)
S[i][j] =
((S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1] + P + a[i][j]) % P+P)%P;
for (int i = 0; i <= 300; i++)
for (int j = 1; j <= 300 - 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;
else
S1[i][j] = ((S1[i][j] + S[i + k][j - 1 - k] -
S[i + k - 1][j - 1 - k] + P) %
P+P)%P;
for (int i = 0; i <= 300; i++)
for (int j = 1; j <= 300 - 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;
else
S2[i][j] = ((S2[i][j] + S[j - 1 - k][i + k] -
S[j - 1 - k][i + k - 1] + P) %
P+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;
}
詳細信息
Test #1:
score: 100
Accepted
time: 76ms
memory: 19996kb
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: 76ms
memory: 19960kb
input:
6 3 ?????? 2 2 2 2 3 3 3 3 3
output:
30 72 96
result:
ok 3 lines
Test #3:
score: 0
Accepted
time: 78ms
memory: 9244kb
input:
1 1 ? 0 1 1
output:
2
result:
ok single line: '2'
Test #4:
score: 0
Accepted
time: 77ms
memory: 28476kb
input:
10 10 acab?cbaca 0 2 0 1 1 2 4 2 3 1 1 1 3 5 1 0 5 2 2 2 0 1 2 5 4 3 0 1 1 3
output:
0 1 1 1 1 0 1 1 1 1
result:
ok 10 lines
Test #5:
score: 0
Accepted
time: 77ms
memory: 28116kb
input:
10 10 ?c?c?cbac? 10 5 1 5 8 7 9 2 6 5 7 1 5 2 6 5 6 5 5 10 3 9 1 10 2 5 9 1 2 9
output:
16 16 11 16 11 16 16 5 11 0
result:
ok 10 lines
Test #6:
score: -100
Wrong Answer
time: 76ms
memory: 116596kb
input:
50 100 ?abacbacab?cbcbcb?acabcbabcbcacbababc?caba?acacbca 8 3 8 2 4 8 8 7 3 0 9 2 10 8 7 7 6 5 4 10 2 6 9 3 3 6 6 9 10 8 2 5 8 8 1 0 3 5 0 1 0 6 5 0 8 6 5 5 1 7 9 7 7 10 4 7 5 6 6 4 10 1 2 4 1 7 10 0 8 7 6 3 1 9 1 4 7 2 8 4 0 8 6 1 5 10 4 5 8 2 5 8 4 4 5 9 5 2 1 1 10 9 4 10 1 8 4 3 8 9 9 8 0 1 0 8 0...
output:
8 8 8 1000000006 8 8 6 8 8 8 8 0 0 0 1 8 4 8 8 8 2 4 1 8 0 6 0 2 8 6 8 8 1 4 2 8 8 0 1000000006 8 2 0 8 8 8 4 8 8 8 8 2 0 0 4 8 8 1 8 7 6 7 0 8 8 8 0 4 7 8 4 0 8 0 4 8 8 8 7 8 4 7 2 8 8 8 0 2 2 8 8 8 4 4 0 8 0 8 8 1 1
result:
wrong answer 4th lines differ - expected: '0', found: '1000000006'