QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#714684#9536. Athlete Welcome Ceremonyucup-team1766WA 1ms20196kbC++203.9kb2024-11-06 02:25:032024-11-06 02:25:04

Judging History

This is the latest submission verdict.

  • [2024-11-06 02:25:04]
  • Judged
  • Verdict: WA
  • Time: 1ms
  • Memory: 20196kb
  • [2024-11-06 02:25:03]
  • Submitted

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'