QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#770242 | #9536. Athlete Welcome Ceremony | Yuanyin26 | WA | 27ms | 37576kb | C++20 | 2.9kb | 2024-11-21 21:14:14 | 2024-11-21 21:14:14 |
Judging History
answer
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<string.h>
#include <string>
#include<math.h>
#include<set>
#include<unordered_map>
#include<unordered_set>
#include<map>
#include<queue>
#include<stack>
#include<functional>
#include<deque>
using namespace std;
#define int long long
#define inf 1e18
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int N = 155;
const int M = 2e5 + 7;
const int mod = 1e9+7;
#define PA pair<int,int>
int dp[305][N][N][4];
int ans[N][N][N];
int cnt[4];
void solve()
{
int n, q;
cin >> n >> q;
string s;
cin >> s;
s = " " + s;
switch (s[1])
{
case 'a':dp[1][1][0][1] = 1; cnt[1]++; break;
case 'b':dp[1][0][1][2] = 1; cnt[2]++; break;
case 'c':dp[1][0][0][3] = 1; cnt[3]++; break;
default:dp[1][1][0][1] = dp[1][0][1][2] = dp[1][0][0][3] = 1;
}
for (int p = 2; p <= n; p++)
{
if (s[p] == 'a')cnt[1]++;
else if (s[p] == 'b')cnt[2]++;
else if (s[p] == 'c')cnt[3]++;
for (int i = 0; i <= 150; i++)
{
if (i > p)break;
for (int j = 0; j <= 150; j++)
{
if (j > p)break;
int k = p - i - j;
if (k < 0)break;
if (s[p] == 'a')
{
if(i>=1)
dp[p][i][j][1] = (dp[p - 1][i - 1][j][2] + dp[p - 1][i - 1][j][3]) % mod;
}
else if (s[p] == 'b')
{
if(j>=1)
dp[p][i][j][2] = (dp[p - 1][i][j-1][1] + dp[p - 1][i][j-1][3]) % mod;
}
else if (s[p] == 'c')
{
if(k>=1)
dp[p][i][j][3] = (dp[p - 1][i][j][2] + dp[p - 1][i][j][1]) % mod;
}
else
{
if(i>=1)
dp[p][i][j][1] = (dp[p - 1][i - 1][j][2] + dp[p - 1][i - 1][j][3]) % mod;
if(j>=1)
dp[p][i][j][2] = (dp[p - 1][i][j - 1][1] + dp[p - 1][i][j - 1][3]) % mod;
if(k>=1)
dp[p][i][j][3] = (dp[p - 1][i][j][2] + dp[p - 1][i][j][1]) % mod;
}
}
}
}
for (int p = 1; p <= 3; p++)
{
for (int i = 0; i <= 150; i++)
{
for (int j = 0; j <= 150; j++)
{
int k = n - i - j;
if (k < 0)break;
ans[i][j][k] = (ans[i][j][k] + dp[n][i][j][p])%mod;
}
}
}
for (int i = 1; i <= 150; i++)
{
for (int j = 1; j <= 150; j++)
{
for (int k = 1; k <= 150; k++)
{
ans[i][j][k] += ans[i][j - 1][k]; //后方
ans[i][j][k] += ans[i - 1][j][k];//左侧
ans[i][j][k] += ans[i][j][k - 1]; //下方
ans[i][j][k] -= ans[i - 1][j - 1][k]; //左后
ans[i][j][k] -= ans[i - 1][j][k - 1]; //左下
ans[i][j][k] -= ans[i][j - 1][k - 1]; //后下
ans[i][j][k] += ans[i - 1][j - 1][k - 1];
ans[i][j][k] %= mod;
}
}
}
while (q--)
{
int x, y, z; cin >> x >> y >> z;
cout << ans[min((int)300,x + cnt[1])][min(300LL,y + cnt[2])][min(300LL,z + cnt[3])]%mod << endl;
}
}
signed main() {
IOS;
int T = 1;//cin >> T;
while (T--) {
solve();
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 8ms
memory: 37092kb
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: 27ms
memory: 37576kb
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: 3ms
memory: 32964kb
input:
1 1 ? 0 1 1
output:
0
result:
wrong answer 1st lines differ - expected: '2', found: '0'