QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#725693#9536. Athlete Welcome CeremonywuyunzhishiWA 31ms4872kbC++203.4kb2024-11-08 19:26:122024-11-08 19:26:12

Judging History

This is the latest submission verdict.

  • [2024-11-08 19:26:12]
  • Judged
  • Verdict: WA
  • Time: 31ms
  • Memory: 4872kb
  • [2024-11-08 19:26:12]
  • Submitted

answer

#include <bits/stdc++.h>
using ll = long long;
#define A 0
#define B 1
#define C 2
const ll mod = 1e9 + 7;
// dp[i][j][k] 表示?中有i个a,j个b,结尾为k的方案数
void solve() {
	int n, q; std::cin >> n >> q;
	std::string s; std::cin >> s;
	std::vector dp(n + 1, std::vector(n + 1, std::vector<ll>(3, 0)));
	if(s[0] == 'a') dp[0][0][A] = 1;
	else if(s[0] == 'b') dp[0][0][B] = 1;
	else if(s[0] == 'c') dp[0][0][C] = 1;
	else {
		dp[1][0][A] = 1;
		dp[0][1][B] = 1;
		dp[0][0][C] = 1;;
	}

	for(int i = 1; i < n; i++) {
		std::vector<std::vector<std::vector<ll>>> t = dp;
		if(s[i] == '?') {
			for(int x = 0; x <= n; x++) {
				for(int y = 0; y <= n; y++) {
				
					if(x - 1 >= 0) dp[x][y][A] =( t[x - 1][y][B] + t[x - 1][y][C]) % mod;
					else dp[x][y][A] = 0;
					if(y - 1 >= 0) dp[x][y][B] = (t[x][y - 1][A] + t[x][y - 1][C]) % mod;
					else dp[x][y][B] = 0;
					dp[x][y][C] = (t[x][y][A] + t[x][y][B]) % mod;
				}
			}
		}
		else if(s[i] == 'a') {
			for(int x = 0; x <= n; x++) {
				for(int y = 0; y <= n; y++) {
					dp[x][y][A] = (t[x][y][B] + t[x][y][C]) % mod;
					dp[x][y][B] = 0;
					dp[x][y][C] = 0;
				}
			}
		}
		else if(s[i] == 'b') {
			for(int x = 0; x <= n; x++) {
				for(int y = 0; y <= n; y++) {
					dp[x][y][B] = (t[x][y][A] + t[x][y][C]) % mod;
					dp[x][y][A] = 0;
					dp[x][y][C] = 0;
				}
			}
		}
		else if(s[i] == 'c') {
			for(int x = 0; x <= n; x++) {
				for(int y = 0; y <= n; y++) {
					dp[x][y][C] = (t[x][y][A] + t[x][y][B]) % mod;
					dp[x][y][A] = 0;
					dp[x][y][B] = 0;
				}
			}
		}
//		std::cout << '\n' << i << ": " << '\n';
//		for(int x = 0; x <= n; x++) {
//			for(int y = 0; y <= n; y++) {
//				std::cerr << dp[x][y][A] + dp[x][y][B] + dp[x][y][C] << " ";
//			}
//			std::cout << '\n';
//		}
	}
	
	std::vector sum(n + 1, std::vector<int>(n + 1, 0));
	for(int i = 0; i <= n; i++) {
		for(int j = 0; j <= n; j++) {
			sum[i][j] = (dp[i][j][A] + dp[i][j][B] + dp[i][j][C]) % mod;
		}
	}
	
	for(int i = 0; i <= n; i++) {
		for(int j = 0; j <= n; j++) {
			if(i + 1 <= n) sum[i + 1][j] += sum[i][j];  
			sum[i][j] %= mod;
		}
	}
	
	for(int i = 0; i <= n; i++) {
		for(int j = 0; j <= n; j++) {
			if(j + 1 <= n) sum[i][j + 1] += sum[i][j];
			sum[i][j] %= mod;
		}
	}
	
	std::vector sumt(n + 1, std::vector<int>(n + 1, 0));
	for(int x = 0; x <= n; x++) {
		for(int y = 0; y <= n; y++) {
			sumt[x][y] = dp[x][y][A] + dp[x][y][B] + dp[x][y][C];
			sumt[x][y] %= mod;
		}
	}
	
	for(int i = 0; i <= n; i++) {
		for(int j = 0; j <= n; j++) {
			if(i + 1 <= n) sumt[i + 1][j] += sumt[i][j];  
			sumt[i][j] %= mod;
		}
	}
	int d = 0;
	for(int i = 0; i < s.size(); i++) {
		if(s[i] == '?') d++;
	}
//	for(int x = 0; x <= n; x++) {
//		for(int y = 0; y <= n; y++) {
//			std::cerr << dp[x][y][A] + dp[x][y][B] + dp[x][y][C] << " ";
//		}
//		std::cout << '\n';
//	}
	while(q--) {
		int x, y, z;
		std::cin >> x >> y >> z; 
		// x + y  < d - z
		ll ans = sum[x][y];
		for(int j = 0; j <= n; j++) {
			if(j > y) break;
			int i = std::min(x, d - z - j - 1);
			if(i < 0) break;
			ans -= sumt[i][j];
			ans %= mod;
//			std::cout << i << '\n';
		}
		std::cout << (ans % mod + mod) % mod<< '\n';
	}	
}

int main()
{
	//std::ios::sync_with_stdio(0);
	//std::cin.tie(0);
	//std::cout.tie(0);
	int t = 1;
//	std::cin >> t;
	while(t--) solve();
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3536kb

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: 3480kb

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: 0ms
memory: 3548kb

input:

1 1
?
0 1 1

output:

2

result:

ok single line: '2'

Test #4:

score: 0
Accepted
time: 0ms
memory: 3580kb

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: 0ms
memory: 3548kb

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: 0
Accepted
time: 4ms
memory: 3888kb

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
0
8
8
6
8
8
8
8
0
0
0
1
8
4
8
8
8
2
4
1
8
1
6
0
2
8
6
8
8
1
4
2
8
8
0
0
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:

ok 100 lines

Test #7:

score: 0
Accepted
time: 4ms
memory: 3872kb

input:

50 100
b????????bca?????c?b??ca?acac?b?b???ca?ab???a?a???
35 43 36
12 49 47
7 11 34
38 44 22
42 17 10
49 8 38
18 26 44
6 18 14
28 29 6
48 32 47
29 15 48
1 5 33
24 17 18
10 27 32
19 10 34
2 23 9
14 24 39
46 12 34
9 49 26
21 8 46
43 43 3
31 16 2
8 27 7
24 41 35
17 25 31
0 13 47
24 31 23
33 40 30
36 39...

output:

34272000
31599360
497244
34272000
17637520
12290752
34272000
93044
415832
34272000
34272000
0
34272000
16360704
27933952
0
34272000
33886976
7896832
12290752
718
24
0
34272000
34272000
0
34272000
34272000
34272000
32254720
0
5666944
34256640
34272000
34272000
12290752
30493248
34256640
20630016
0
10...

result:

ok 100 lines

Test #8:

score: 0
Accepted
time: 30ms
memory: 4716kb

input:

100 1000
c?cbababcabacbacbacacbacabcbabababacababcbcab?cbabacbacbcbcacbab?bcabcbcababcacbabacbcb?babcbab?baca
13 11 4
4 17 20
14 5 2
16 14 15
8 12 17
19 5 11
5 17 12
20 7 6
19 10 1
6 5 0
13 1 9
7 17 1
20 4 16
11 12 18
19 2 16
18 1 11
19 16 3
7 1 0
6 9 16
6 9 16
6 20 7
0 16 20
1 2 8
16 5 20
18 14 18
...

output:

16
15
14
16
16
16
16
16
8
2
16
8
16
16
16
16
16
2
16
16
16
0
1
16
16
5
1
5
16
16
16
16
16
15
16
13
16
15
2
16
16
1
8
16
16
16
15
0
16
15
16
16
16
16
8
8
16
16
16
16
16
16
8
16
16
1
8
8
16
16
1
16
1
0
16
2
2
16
7
16
16
8
16
16
16
16
1
16
14
16
16
16
16
5
16
16
14
16
11
16
15
11
2
1
8
16
16
7
16
5
16
...

result:

ok 1000 lines

Test #9:

score: -100
Wrong Answer
time: 31ms
memory: 4872kb

input:

100 1000
?????c??????????????????????????b???a????a?????????????????????????c????????????????????????????????
43 38 20
27 40 32
39 27 33
28 50 43
50 3 46
38 46 14
42 48 10
45 25 28
49 10 49
38 17 42
41 49 22
41 18 44
46 47 25
17 44 35
34 43 22
47 42 32
32 44 40
36 41 24
45 38 45
49 44 18
42 34 32
43...

output:

224395430
913793437
4563726
384010157
10104
197660252
652156990
598792985
723977166
364727280
53305040
41149640
796157561
67704502
294652994
809150594
78104944
803262738
246287208
85913260
348499423
37880765
328268702
234513462
150732706
268625096
653465782
290988783
705467745
701986883
76843865
706...

result:

wrong answer 1st lines differ - expected: '490475656', found: '224395430'