QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#714932#9536. Athlete Welcome Ceremonybeamishboys#WA 613ms230708kbC++232.1kb2024-11-06 09:15:452024-11-06 09:15:46

Judging History

This is the latest submission verdict.

  • [2024-11-06 09:15:46]
  • Judged
  • Verdict: WA
  • Time: 613ms
  • Memory: 230708kb
  • [2024-11-06 09:15:45]
  • Submitted

answer

#include <vector>
#include <iostream>

using namespace std;
using ll = long long;

ll n, Q;
string s;
const ll mn = 300;
ll dp[mn+1][mn+1][mn+1][3];
ll dp2[mn+1][mn+1][mn+1];
const ll mod = 1e9+7;

void fix(ll &i) {
	i %= mod;
	i += mod;
	i %= mod;
}


signed main() {
	cin >> n >> Q;
	cin >> s;

	if (s[0] == 'a' || s[0] == '?') {
		dp[1][0][0][0] = 1;
	}
	if (s[0] == 'b' || s[0] == '?') {
		dp[0][1][0][1] = 1;
	}
	if (s[0] == 'c' || s[0] == '?') {
		dp[0][0][1][2] = 1;
	}


	ll m;
	for (ll m = 2; m <= n; m++) {
		for (ll i = 0; i <= m; i++) {
			for (ll j = 0; i+j <= m; j++) {
				ll k = m-i-j;
				for (ll l = 0; l < 3; l++) {
					if (s[m-1] != '?' && l != s[m-1] - 'a') continue;

					if (l == 0 && i != 0) {
						dp[i][j][k][l] = dp[i-1][j][k][1] + dp[i-1][j][k][2];
					}
					if (l == 1 && j != 0) {
						dp[i][j][k][l] = dp[i][j-1][k][0] + dp[i][j-1][k][2];
					}
					if (l == 2 && k != 0) {
						dp[i][j][k][l] = dp[i][j][k-1][0] + dp[i][j][k-1][1];
					}
					fix(dp[i][j][k][l]);

					if (m == n) {
						dp2[i][j][k] += dp[i][j][k][l];
						fix(dp2[i][j][k]);
					}
				}
			}
		}
	}

	for (ll i = 0; i <= mn; i++) {
		for (ll j = 0; j <= mn; j++) {
			for (ll k = 0; k <= mn; k++) {
				if (i > 0) dp2[i][j][k] += dp2[i-1][j][k];
				if (j > 0) dp2[i][j][k] += dp2[i][j-1][k];
				if (k > 0) dp2[i][j][k] += dp2[i][j][k-1];
				fix(dp2[i][j][k]);

				if (i > 0 && j > 0) dp2[i][j][k] -= dp2[i-1][j-1][k];
				if (j > 0 && k > 0) dp2[i][j][k] -= dp2[i][j-1][k-1];
				if (k > 0 && i > 0) dp2[i][j][k] -= dp2[i-1][j][k-1];
				fix(dp2[i][j][k]);

				if (i > 0 && j > 0 && k > 0) dp2[i][j][k] += dp2[i-1][j-1][k-1];
				fix(dp2[i][j][k]);
			}
		}
	}

	vector<ll> counts(3);
	for (ll i = 0; i < n; i++) {
		if (s[i] == '?') continue;
		counts[s[i] - 'a']++;
	}

	ll a, b, c;
	for (ll i = 0; i < Q; i++) {
		cin >> a >> b >> c;
		a += counts[0];
		a = min(a, mn);
		b += counts[1];
		b = min(b, mn);
		c += counts[2];
		c = min(c, mn);
		cout << dp2[a][b][c] << "\n";
	}

	return 0;
}


Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 600ms
memory: 224804kb

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: 591ms
memory: 230708kb

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: 613ms
memory: 220464kb

input:

1 1
?
0 1 1

output:

0

result:

wrong answer 1st lines differ - expected: '2', found: '0'