QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#714684 | #9536. Athlete Welcome Ceremony | ucup-team1766 | WA | 1ms | 20196kb | C++20 | 3.9kb | 2024-11-06 02:25:03 | 2024-11-06 02:25:04 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define pb push_back
#define f first
#define s second
#define pll pair<ll, ll>
#define pii pair<int, int>
const int MOD = 1e9+7;
const int N = 300;
int dp[N+1][N+1][N+1][3];
int vals[N+1][N+1][N+1];
int pref[N+1][N+1][N+1];
int main(){
cin.tie(0), ios::sync_with_stdio(0);
int n, q;
cin >> n >> q;
string str;
cin >> str;
if(str[0] == 'a'){
dp[1][0][0][0] = 1;
}else if(str[0] == 'b'){
dp[1][0][0][1] = 1;
}
else if(str[0] == 'c'){
dp[1][0][0][2] = 1;
}else{
dp[1][1][0][0] = 1;
dp[1][0][1][1] = 1;
dp[1][0][0][2] = 1;
}
for(int i = 2; i <= n; i++){
char c = str[i-1];
for(int j = 0; j <= n; j++){
for(int k = 0; k <= n; k++){
if(c == 'a'){
dp[i][j][k][0] = (dp[i-1][j][k][1] + dp[i-1][j][k][2])%MOD;
}else if(c == 'b'){
dp[i][j][k][1] = (dp[i-1][j][k][0] + dp[i-1][j][k][2])%MOD;
}else if(c == 'c'){
dp[i][j][k][2] = (dp[i-1][j][k][0] + dp[i-1][j][k][1])%MOD;
}else{
if (j) dp[i][j][k][0] = (dp[i-1][j-1][k][1] + dp[i-1][j-1][k][2])%MOD;
if (k) dp[i][j][k][1] = (dp[i-1][j][k-1][0] + dp[i-1][j][k-1][2])%MOD;
dp[i][j][k][2] = (dp[i-1][j][k][0] + dp[i-1][j][k][1])%MOD;
}
}
}
}
int ques = count(str.begin(),str.end(),'?');
for (int a = 0; a <= n; a++) for (int b = 0; b <= n; b++) {
if (0 <= ques-a-b and ques-a-b <= n) vals[a][b][ques-a-b] = accumulate(dp[n][a][b], dp[n][a][b]+3, 0ll) % MOD;
}
/*
for (int i = 1; i <= n; i++) for (int j = 0; j <= n; j++) for (int k = 0; k <= n; k++) {
pref[i][j][k] = (pref[i][j][k] + pref[i-1][j][k]) % MOD;
}
for (int i = 0; i <= n; i++) for (int j = 1; j <= n; j++) for (int k = 0; k <= n; k++) {
pref[i][j][k] = (pref[i][j][k] + pref[i][j-1][k]) % MOD;
}
for (int i = 0; i <= n; i++) for (int j = 0; j <= n; j++) for (int k = 1; k <= n; k++) {
pref[i][j][k] = (pref[i][j][k] + pref[i][j][k-1]) % MOD;
}
*/
/*
for (int i = 0; i <= n; i++){
for (int j = 0; j <= n; j++){
for (int k = 0; k <= n; k++) {
cout << vals[i][j][k] << " ";
}
cout << "\n";
}
cout << "\n";
}
*/
for(int i = 0; i <= n; i++){
for(int j = 0; j <= n; j++){
ll val = (ll)vals[i][j][0];
if(i){
val += pref[i-1][j][0];
}if(j){
val += pref[i][j-1][0];
}
if(i & j){
val -= pref[i-1][j-1][0];
}
pref[i][j][0] = val % MOD;
}
}
for(int j = 0; j <= n; j++){
for(int k = 0; k <= n; k++){
ll val = (ll)vals[0][j][k];
if(j){
val += pref[0][j-1][k];
}if(k){
val += pref[0][j][k-1];
}if(j & k){
val -= pref[0][j-1][k-1];
}
pref[0][j][k] = val % MOD;
}
}
for(int i = 0; i <= n; i++){
for(int k = 0; k <= n; k++){
ll val = (ll)vals[i][0][k];
if(i){
val += pref[i-1][0][k];
}if(k){
val += pref[i][0][k-1];
}if(i & k){
val -= pref[i-1][0][k-1];
}
pref[i][0][k] = val % MOD;
}
}
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
for (int k = 1; k <= n; k++) {
ll val = (ll)vals[i][j][k] + pref[i-1][j][k] + pref[i][j-1][k] + pref[i][j][k-1] - pref[i-1][j-1][k] - pref[i-1][j][k-1] - pref[i][j-1][k-1] + pref[i-1][j-1][k-1];
pref[i][j][k] = val % MOD;
}
}
}
/*
for (int i = 0; i <= n; i++){
for (int j = 0; j <= n; j++){
for (int k = 0; k <= n; k++) {
cout << pref[i][j][k] << " ";
}
cout << "\n";
}
cout << "\n";
}
*/
while (q--) {
int x, y, z; cin >> x >> y >> z;
cout << pref[x][y][z] << '\n';
}
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 17884kb
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: 0ms
memory: 15856kb
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: 1ms
memory: 7656kb
input:
1 1 ? 0 1 1
output:
2
result:
ok single line: '2'
Test #4:
score: -100
Wrong Answer
time: 0ms
memory: 20196kb
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 11 1 7 0 2 1 7 1
result:
wrong answer 3rd lines differ - expected: '1', found: '11'