QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#766455#9536. Athlete Welcome CeremonyospoasaWA 1ms6152kbC++202.8kb2024-11-20 17:24:242024-11-20 17:24:25

Judging History

This is the latest submission verdict.

  • [2024-11-20 17:24:25]
  • Judged
  • Verdict: WA
  • Time: 1ms
  • Memory: 6152kb
  • [2024-11-20 17:24:24]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int N = 305;
const LL mod = 998244353;

LL dp[2][N][N][3], f[N][N][N], A[N][N][N]; // 前i个字符, 选j个a, k个b
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n, q;
    cin >> n >> q;
    string S;
    cin >> S;
    S = ' ' + S;
    
    if(S[1] == 'a') dp[1][1][0][0] = 1;
    else if(S[1] == 'b') dp[1][0][1][1] = 1;
    else if(S[1] == 'c') dp[1][0][0][2] = 1;
    else dp[1][1][0][0] = dp[1][0][1][1] = dp[1][0][0][2] = 1;
    
    int up, now;
    for(int i = 2; i <= n; i++) 
    {
        up = (i + 1) % 2;
        now = up ^ 1;
        for(int j = 0; j <= i; j++) 
        {
            for(int k = 0; k <= i; k++) 
            {
                if(j + k > i) break;
                if(S[i] == 'a' || S[i] == '?') {
                    if(j > 0)
                    dp[now][j][k][0] = dp[up][j - 1][k][1] + dp[up][j - 1][k][2];
                    dp[now][j][k][0] %= mod;
                }

                if(S[i] == 'b' || S[i] == '?') {
                    if(k > 0)
                    dp[now][j][k][1] = dp[up][j][k - 1][0] + dp[up][j][k - 1][2];
                    dp[now][j][k][1] %= mod;
                }

                if(S[i] == 'c' || S[i] == '?') {
                    if(j + k < i)
                    dp[now][j][k][2] = dp[up][j][k][0] + dp[up][j][k][1];
                    dp[now][j][k][2] %= mod;
                }
            }
        }

        for(int j = 0; j <= i; j++) {
            for(int k = 0; k <= i; k++) {
                dp[up][j][k][0] = dp[up][j][k][1] = dp[up][j][k][2] = 0;
            }
        }
    }

    
    for(int i = 0; i <= n; i++) {
        for(int j = 0; j <= n; j++) {
            if(i + j > n) break;
            for(int h = 0; h < 3; h++) {
                A[i + 1][j + 1][n - i - j + 1] += dp[now][i][j][h];
                A[i + 1][j + 1][n - i - j + 1] %= mod;
            }
        }
    }

    for(int i = 1; i <= n + 1; i++)
	for(int j = 1; j <= n + 1; j++)
	for(int k = 1; k <= n + 1; k++) {
        f[i][j][k] = f[i - 1][j][k] + f[i][j - 1][k] + f[i][j][k - 1]
	    - f[i - 1][j - 1][k] - f[i - 1][j][k - 1] - f[i][j - 1][k - 1]
	    + f[i - 1][j - 1][k - 1] + A[i][j][k] + mod * 3;
        f[i][j][k] %= mod;
    }

    int ca = 0, cb = 0, cc = 0;
    for(int i = 1; i <= n; i++) {
        if(S[i] == 'a') ca++;
        else if(S[i] == 'b') cb++;
        else if(S[i] == 'c') cc++;
    }

    int x2, y2, z2;
    for(int i = 1; i <= q; i++) {
        cin >> x2 >> y2 >> z2;
        x2 = min(n, x2 + ca);
        y2 = min(n, y2 + cb);
        z2 = min(n, z2 + cc);
        x2++, y2++, z2++;
        cout << f[x2][y2][z2] << '\n';
    }
			

    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 6152kb

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: 1ms
memory: 6076kb

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: 1ms
memory: 5700kb

input:

1 1
?
0 1 1

output:

0

result:

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