QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#703366#9536. Athlete Welcome Ceremonyucup-team4975#WA 78ms116596kbC++173.6kb2024-11-02 17:39:382024-11-02 17:39:38

Judging History

This is the latest submission verdict.

  • [2024-11-02 17:39:38]
  • Judged
  • Verdict: WA
  • Time: 78ms
  • Memory: 116596kb
  • [2024-11-02 17:39:38]
  • Submitted

answer

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 305;
const int P = 1000000007;
int f[N][N][N]
	 [3];  // 到第i位,恰好用了j个a;用了k个b用了i-j-k个c,最后一位恰好用。。。
string s;
int n, q;

int S[N][N], S1[N][N], S2[N][N];  // i a  j  b
int a[N][N];
int numa, numb, numc;
signed main()
{
	cin >> n >> q;
	cin >> s;
	s = " " + s;
	for (int i = 1; i <= n; i++) {
		if (s[i] == 'a')
			numa++;
		if (s[i] == 'b')
			numb++;
		if (s[i] == 'c')
			numc++;
	}
	if (s[1] == 'a') {
		f[1][1][0][0] = 1;
	}
	else if (s[1] == 'b') {
		f[1][0][1][1] = 1;
	}
	else if (s[1] == 'c') {
		f[1][0][0][2] = 1;
	}
	else {
		f[1][1][0][0] = f[1][0][1][1] = f[1][0][0][2] = 1;
	}

	for (int i = 2; i <= n; i++) {
		for (int j = 0; j <= i; j++)
			for (int k = 0; k <= i - j; k++) {
				if (j >= 1)
					f[i][j][k][0] =
						(f[i - 1][j - 1][k][1] + f[i - 1][j - 1][k][2]) % P;
				if (k >= 1)
					f[i][j][k][1] =
						(f[i - 1][j][k - 1][0] + f[i - 1][j][k - 1][2]) % P;
				if (i - j - k >= 1)
					f[i][j][k][2] = (f[i - 1][j][k][0] + f[i - 1][j][k][1]) % P;
				if (s[i] == 'a') {
					f[i][j][k][1] = f[i][j][k][2] = 0;
				}
				else if (s[i] == 'b') {
					f[i][j][k][0] = f[i][j][k][2] = 0;
				}
				else if (s[i] == 'c') {
					f[i][j][k][0] = f[i][j][k][1] = 0;
				}
			}
	}
	/*for (int j = 0; j <= n; j++)
		for (int k = 0; k <= n - j; k++) {
			cout << j << " " << k << " " << n - j - k << " " << f[n][j][k][0]
				 << " " << f[n][j][k][1] << " " << f[n][j][k][2] << endl;
		}*/
	for (int i = 0; i <= 300; i++)
		for (int j = 0; j <= 300; j++)
			a[i][j] = (f[n][i][j][0] + f[n][i][j][1] + f[n][i][j][2]) % P;
	S[0][0] = a[0][0];
	for (int i = 1; i <= 300; i++)
		S[i][0] = (S[i - 1][0] + a[i][0]) % P;
	for (int i = 1; i <= 300; i++)
		S[0][i] = (S[0][i - 1] + a[0][i]) % P;
	for (int i = 1; i <= 300; i++)
		for (int j = 1; j <= 300; j++)
			S[i][j] =
				((S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1] + P + a[i][j]) % P+P)%P;
	for (int i = 0; i <= 300; i++)
		for (int j = 1; j <= 300 - i + 1; j++)
			for (int k = 0; k <= j - 1; k++)
				if (i + k == 0)
					S1[i][j] = (S1[i][j] + S[i + k][j - 1 - k] ) % P;
				else
					S1[i][j] = ((S1[i][j] + S[i + k][j - 1 - k] -
								S[i + k - 1][j - 1 - k] + P) %
							   P+P)%P;
	for (int i = 0; i <= 300; i++)
		for (int j = 1; j <= 300 - i + 1; j++)
			for (int k = 0; k <= j - 1; k++)
				if (i + k == 0)
					S2[i][j] = (S2[i][j] + S[j - 1 - k][i + k] ) % P;
				else
					S2[i][j] = ((S2[i][j] + S[j - 1 - k][i + k] -
								S[j - 1 - k][i + k - 1] + P) %
							   P+P)%P;

	while (q--) {
		int a, b, c;
		scanf("%lld%lld%lld", &a, &b, &c);
		// x<=a
		// y<=b
		// x+y>=n-c
		a += numa;
		b += numb;
		c += numc;
		if (a > n)
			a = n;
		if (b > n)
			b = n;
		if (c > n)
			c = n;
		int ans;
		if (a >= b) {
			if (n - c > a + b)
				ans = 0;
			else if (n - c > a)
				ans = S[a][b] - S1[0][n - c] + S1[a + 1][n - c - a - 1] +
					  S2[b + 1][n - c - b - 1];
			else if (n - c > b)
				ans = S[a][b] - S[n - b - c - 1][b] - S1[n - b - c][b];
			else if (n - c > 0)
				ans = S[a][b] - S1[0][n - c];
			else
				ans = S[a][b];
		}
		else if (a < b) {
			if (n - c > a + b)
				ans = 0;
			else if (n - c > b)
				ans = S[a][b] - S1[0][n - c] + S2[b + 1][n - c - b - 1] +
					  S2[a + 1][n - c - a - 1];
			else if (n - c > a)
				ans = S[a][b] - S[a][n - a - c - 1] - S2[n - a - c][a];
			else if (n - c > 0)
				ans = S[a][b] - S1[0][n - c];
			else
				ans = S[a][b];
		}
		ans = (ans % P + P) % P;
		printf("%lld\n",ans);
	}
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 76ms
memory: 19996kb

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: 76ms
memory: 19960kb

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: 78ms
memory: 9244kb

input:

1 1
?
0 1 1

output:

2

result:

ok single line: '2'

Test #4:

score: 0
Accepted
time: 77ms
memory: 28476kb

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: 77ms
memory: 28116kb

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: -100
Wrong Answer
time: 76ms
memory: 116596kb

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

wrong answer 4th lines differ - expected: '0', found: '1000000006'