QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#751660#9536. Athlete Welcome CeremonyPleaseHackmeML 0ms0kbC++203.3kb2024-11-15 20:02:492024-11-15 20:02:49

Judging History

This is the latest submission verdict.

  • [2024-11-15 20:02:49]
  • Judged
  • Verdict: ML
  • Time: 0ms
  • Memory: 0kb
  • [2024-11-15 20:02:49]
  • Submitted

answer

#include <bits/stdc++.h>
using i64 = int64_t;


const int mod = 1e9 + 7;
void solve() {
  int n, q;
  std::cin >> n >> q;

  std::string s;
  std::cin >> s;
  s = " " + s;

  std::vector f(301, std::vector<std::vector<std::vector<int>>>(301, std::vector<std::vector<int>>(301, std::vector<int>(3))));
  int cnt = 0;
  for (int i = 1; i <= n; i ++) { 
    std::vector g(cnt + 1, std::vector<std::vector<std::vector<int>>>(cnt + 1, std::vector<std::vector<int>>(cnt + 1, std::vector<int>(3))));
    if (s[i] == '?') {
      if (i == 1) {
        g[1][0][0][0] = 1;
        g[0][1][0][1] = 1;
        g[0][0][1][2] = 1;
      } else {
        for (int a = 0; a <= cnt; a ++) {
          for (int b = 0; a + b <= cnt; b ++) {
            int c = cnt - a - b;
            if (c < 0) continue;
            //? = a
            g[a + 1][b][c][0] = (f[a][b][c][1] + f[a][b][c][2]) % mod;
            //? = b
            g[a][b + 1][c][1] = (f[a][b][c][0] + f[a][b][c][2]) % mod;
            //? = c
            g[a][b][c + 1][2] = (f[a][b][c][0] + f[a][b][c][1]) % mod;
          }
        }
      }
    } else {
      if (i != 1) {
        for (int a = 0; a <= cnt; a ++) {
          for (int b = 0; a + b <= cnt; b ++) {
            int c = cnt - a - b;
            if (c < 0) continue;
            if (s[i] == 'a') {
              g[a][b][c][0] = (f[a][b][c][1] + f[a][b][c][2]) % mod;
            } else if (s[i] == 'b') {
              g[a][b][c][1] = (f[a][b][c][0] + f[a][b][c][2]) % mod;
            } else {
              g[a][b][c][2] = (f[a][b][c][0] + f[a][b][c][1]) % mod;
            }
          }
        }
      } else {
        if (s[i] == 'a') g[0][0][0][0] = 1;
        if (s[i] == 'b') g[0][0][0][1] = 1;
        if (s[i] == 'c') g[0][0][0][2] = 1;
      }
    }
    if (s[i] == '?') cnt ++;
    f.swap(g);
  }

  std::vector ans(301, std::vector<std::vector<int>>(301, std::vector<int>(301)));
  for (int i = 0; i <= cnt; i ++) {
    for (int j = 0; i + j <= cnt; j ++) {
      for (int k = 0; i + j + k <= cnt; k ++) {
        ans[i][j][k] = (f[i][j][k][0] + f[i][j][k][1] + f[i][j][k][2]) % mod;
      }
    }
  }

  for (int i = 0; i <= 300; i++) {
    for (int j = 0; j <= 300; j++) {
        for (int k = 0; k <= 300; k++) {
            if (i > 0) ans[i][j][k] += ans[i - 1][j][k];
            ans[i][j][k] %= mod;
            if (j > 0) ans[i][j][k] += ans[i][j - 1][k]; 
            ans[i][j][k] %= mod;
            if (k > 0) ans[i][j][k] += ans[i][j][k - 1]; 
            ans[i][j][k] %= mod;
            if (i && j) ans[i][j][k] += mod - ans[i - 1][j - 1][k];
            ans[i][j][k] %= mod;
            if (k && j) ans[i][j][k] += mod - ans[i][j - 1][k - 1];
            ans[i][j][k] %= mod;
            if (i && k) ans[i][j][k] += mod - ans[i - 1][j][k - 1];
            ans[i][j][k] %= mod;
            if (i && j && k) ans[i][j][k] += ans[i - 1][j - 1][k - 1];
            ans[i][j][k] %= mod;
        }
    }
  }
  while (q --) {
    int a, b, c;
    std::cin >> a >> b >> c;
    std::cout << (ans[a][b][c] + mod) % mod << "\n";
  }
}
signed main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);

  int t;
  t = 1;
  //std::cin >> t;

  while (t--) {
    solve();
  }

  return 0;
}

详细

Test #1:

score: 0
Memory Limit Exceeded

input:

6 3
a?b??c
2 2 2
1 1 1
1 0 2

output:


result: