QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#770242#9536. Athlete Welcome CeremonyYuanyin26WA 27ms37576kbC++202.9kb2024-11-21 21:14:142024-11-21 21:14:14

Judging History

This is the latest submission verdict.

  • [2024-11-21 21:14:14]
  • Judged
  • Verdict: WA
  • Time: 27ms
  • Memory: 37576kb
  • [2024-11-21 21:14:14]
  • Submitted

answer

#define  _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<string.h>
#include <string>
#include<math.h>
#include<set>
#include<unordered_map>
#include<unordered_set>
#include<map>
#include<queue>
#include<stack>
#include<functional>
#include<deque>
using namespace std;
#define int long long 
#define inf 1e18
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int N = 155;
const int M = 2e5 + 7;
const int mod = 1e9+7;
#define PA pair<int,int>
int dp[305][N][N][4];
int ans[N][N][N];
int cnt[4];
void solve()
{
	int n, q;
	cin >> n >> q;
	string s;
	cin >> s;
	s = " " + s;
	switch (s[1])
	{
	case 'a':dp[1][1][0][1] = 1; cnt[1]++; break;
	case 'b':dp[1][0][1][2] = 1; cnt[2]++; break;
	case 'c':dp[1][0][0][3] = 1; cnt[3]++; break;
	default:dp[1][1][0][1] = dp[1][0][1][2] = dp[1][0][0][3] = 1;
	}
	for (int p = 2; p <= n; p++)
	{
		if (s[p] == 'a')cnt[1]++;
		else if (s[p] == 'b')cnt[2]++;
		else if (s[p] == 'c')cnt[3]++;
		for (int i = 0; i <= 150; i++)
		{
			if (i > p)break;
			for (int j = 0; j <= 150; j++)
			{
				if (j > p)break;
				int k = p - i - j;
				if (k < 0)break;
				if (s[p] == 'a')
				{
					if(i>=1)
						dp[p][i][j][1] = (dp[p - 1][i - 1][j][2] + dp[p - 1][i - 1][j][3]) % mod;
				}
				else if (s[p] == 'b')
				{
					if(j>=1)
						dp[p][i][j][2] = (dp[p - 1][i][j-1][1] + dp[p - 1][i][j-1][3]) % mod;
				}
				else if (s[p] == 'c')
				{
					if(k>=1)
						dp[p][i][j][3] = (dp[p - 1][i][j][2] + dp[p - 1][i][j][1]) % mod;
				}
				else
				{
					if(i>=1)
						dp[p][i][j][1] = (dp[p - 1][i - 1][j][2] + dp[p - 1][i - 1][j][3]) % mod;
					if(j>=1)
						dp[p][i][j][2] = (dp[p - 1][i][j - 1][1] + dp[p - 1][i][j - 1][3]) % mod;
					if(k>=1)
						dp[p][i][j][3] = (dp[p - 1][i][j][2] + dp[p - 1][i][j][1]) % mod;
				}
			}
		}
	}
	for (int p = 1; p <= 3; p++)
	{
		for (int i = 0; i <= 150; i++)
		{
			for (int j = 0; j <= 150; j++)
			{
				int k = n - i - j;
				if (k < 0)break;
				ans[i][j][k] = (ans[i][j][k] + dp[n][i][j][p])%mod;
			}
		}
	}
	for (int i = 1; i <= 150; i++)
	{
		for (int j = 1; j <= 150; j++)
		{
			for (int k = 1; k <= 150; k++)
			{
				ans[i][j][k] += ans[i][j - 1][k]; //后方
				ans[i][j][k] += ans[i - 1][j][k];//左侧
				ans[i][j][k] += ans[i][j][k - 1]; //下方
				ans[i][j][k] -= ans[i - 1][j - 1][k]; //左后
				ans[i][j][k] -= ans[i - 1][j][k - 1]; //左下
				ans[i][j][k] -= ans[i][j - 1][k - 1]; //后下
				ans[i][j][k] += ans[i - 1][j - 1][k - 1];
				ans[i][j][k] %= mod;
			}
		}
	}
	while (q--)
	{
		int x, y, z; cin >> x >> y >> z;
		cout << ans[min((int)300,x + cnt[1])][min(300LL,y + cnt[2])][min(300LL,z + cnt[3])]%mod << endl;
	}
}
signed main() {
	IOS;
	int T = 1;//cin >> T;
	while (T--) {
		solve();
	}
}

详细

Test #1:

score: 100
Accepted
time: 8ms
memory: 37092kb

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: 27ms
memory: 37576kb

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: 3ms
memory: 32964kb

input:

1 1
?
0 1 1

output:

0

result:

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