QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#711029#9536. Athlete Welcome CeremonyKingdywWA 91ms324424kbC++234.5kb2024-11-04 23:52:402024-11-04 23:52:40

Judging History

This is the latest submission verdict.

  • [2024-11-04 23:52:40]
  • Judged
  • Verdict: WA
  • Time: 91ms
  • Memory: 324424kb
  • [2024-11-04 23:52:40]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
#define int long long
int read() {
  int res = 0, flg = 1;
  char c = getchar();
  while(!isdigit(c)) {
    if(c == '-') flg = 0;
    c = getchar();
  }
  while(isdigit(c)) {
    res = (res << 3) + (res << 1) + (c ^ 48);
    c = getchar();
  }
  return flg ? res : -res;
}
const int N = 1e6 + 10, mod = 1e9 + 7;
inline int pls(int a, int b) {
  int m = a + b;
  return (m < mod) ? m : m - mod;
}
inline int dec(int a, int b) {
  int m = a - b;
  return (m < 0) ? m + mod : m;
}
int n, q;
int na, nb, nc;
int dp[2][4][155][155][155], now = 0, pre = 1;
int sum[2][4][155][155][155];
char s[N];
signed main() {
  n = read(), q = read();
  scanf("%s", s + 1);
  int na, nb, nc;
  na = nb = nc = 0;
  
  int num = 0;
  if(s[1] != '?') {
    if(s[1] == 'a') dp[now][0][1][0][0] = 1, na++;
    if(s[1] == 'b') dp[now][1][0][1][0] = 1, nb++;
    if(s[1] == 'c') dp[now][2][0][0][1] = 1, nc++; 
  } else {
    dp[now][0][1][0][0] = 1;
    dp[now][1][0][1][0] = 1;
    dp[now][2][0][0][1] = 1; 
  }
  for(int i = 2; i <= n; ++i) {
    swap(now, pre);
    memset(dp[now], 0, sizeof(dp[now]));
    if(s[i] == '?') {
      for(int a = na; 2 * a <= i + 1; ++a) {
        for(int b = nb; a + b < i && 2 * b <= i + 1; ++b) {
          int c = i - 1 - a - b;
          if(2 * c > i + 1 || c < nc) continue;
          
          for(int last = 0; last < 3; ++last) {
            if(last == 0) continue;
            dp[now][0][a + 1][b][c] = pls(dp[now][0][a + 1][b][c], dp[pre][last][a][b][c]);
          }
          for(int last = 0; last < 3; ++last) {
            if(last == 1) continue;
            dp[now][1][a][b + 1][c] = pls(dp[now][1][a][b + 1][c], dp[pre][last][a][b][c]);
          }
          for(int last = 0; last < 3; ++last) {
            if(last == 2) continue;
            dp[now][2][a][b][c + 1] = pls(dp[now][2][a][b][c + 1], dp[pre][last][a][b][c]);
          }
        }
      }
    } else {
      for(int a = na; a < i && 2 * a <= i + 1; ++a) {
        for(int b = nb; a + b < i && 2 * b <= i + 1; ++b) {
          int c = i - 1 - a - b;
          if(2 * c > i + 1 || c < nc) continue;
          
          for(int last = 0; last < 3; ++last) {
            if(last == s[i] - 'a') continue;
            if(s[i] - 'a' == 0) dp[now][0][a + 1][b][c] = pls(dp[now][0][a + 1][b][c], dp[pre][last][a][b][c]);
            if(s[i] - 'a' == 1) dp[now][1][a][b + 1][c] = pls(dp[now][1][a][b + 1][c], dp[pre][last][a][b][c]);
            if(s[i] - 'a' == 2) dp[now][2][a][b][c + 1] = pls(dp[now][2][a][b][c + 1], dp[pre][last][a][b][c]);
          }
        }
      }
      if(s[1] == 'a') na++;
      if(s[1] == 'b') nb++;
      if(s[1] == 'c') nc++; 
    }
  }
  
  
  //cout << i << '\n';
  
  for(int i = 0; i < 3; ++i) {
    for(int a = 0; a <= 150; ++a) {
      for(int b = 0; b <= 150; ++b) {
        for(int c = 0; c <= 150; ++c) {
          sum[now][i][a][b][c] = dp[now][i][a][b][c];
          if(a >= 1) sum[now][i][a][b][c] = pls(sum[now][i][a][b][c], sum[now][i][a - 1][b][c]);
          if(b >= 1) sum[now][i][a][b][c] = pls(sum[now][i][a][b][c], sum[now][i][a][b - 1][c]);
          if(c >= 1) sum[now][i][a][b][c] = pls(sum[now][i][a][b][c], sum[now][i][a][b][c - 1]);
          if(a >= 1 && b >= 1) sum[now][i][a][b][c] = dec(sum[now][i][a][b][c], sum[now][i][a - 1][b - 1][c]);
          if(a >= 1 && c >= 1) sum[now][i][a][b][c] = dec(sum[now][i][a][b][c], sum[now][i][a - 1][b][c - 1]);
          if(b >= 1 && c >= 1) sum[now][i][a][b][c] = dec(sum[now][i][a][b][c], sum[now][i][a][b - 1][c - 1]);
          if(a >= 1 && b >= 1 && c >= 1) sum[now][i][a][b][c] = pls(sum[now][i][a][b][c], sum[now][i][a - 1][b - 1][c - 1]);
        }
      }
    }
  }
//  cout << dp[now][2][2][2][2] << '\n';
//  cout << sum[now][2][2][2][2] << '\n';
//  cout << sum[now][2][3][3][3] << '\n'; 
//  n = read(), q = read();
//  scanf("%s", s + 1);
  // n = 300, q = 1e3;
  //for(int i = 1; i <= 300; ++i) s[i] = '?';
  int a, b, c;
  for(int i = 1; i <= q; ++i) {
    a = read(), b = read(), c = read();
    a = min(150ll, a + na);
    b = min(150ll, b + nb);
    c = min(150ll, c + nc);
    int res = 0;
    for(int j = 0; j < 3; ++j) {
      res = pls(res, sum[now][j][a][b][c]);
    }
    cout << res << '\n';
    // memset(vis, 0, sizeof(vis));
    // na = read(), nb = read(), nc = read();
    //na = 300, nb = 300, nc = 300;
    //cout << check(1, 3, 0, 0, 0) << '\n';
    //clear(1, 3, 0, 0, 0);
  }
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 91ms
memory: 324424kb

input:

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

output:

0
0
0

result:

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