Problem p02635 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define long long long int
using namespace std;

// @author: pashka

int mod = 998244353;

struct mint {
  int value;
  constexpr mint() : value() {}
  mint(const long &x) { value = normalize(x); }
  static long normalize(const long &x) {
    long v = x % mod;
    if (v < 0)
      v += mod;
    return v;
  }
  bool operator==(const mint &x) { return value == x.value; };
  mint operator+(const mint &x) { return value + x.value; };
  mint operator*(const mint &x) { return (long)value * x.value; };
  void operator+=(const mint &x) { value = normalize(value + x.value); };
};

mint d[301][301][301];
mint w[301][301][301];

int main() {
  ios::sync_with_stdio(false);

  string s;
  int k;
  cin >> s >> k;
  int n = s.size();
  d[0][0][0] = 1;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j <= n; j++) {
      for (int t = 0; t <= k; t++) {
        if (d[i][j][t] == 0 && w[i][j][t] == 0)
          continue;
        //                cout << i << " " << j << " " << t << " " <<
        //                d[i][j][t].value << "\n";
        if (s[i] == '1') {
          d[i + 1][j][t] += d[i][j][t];
          if (j > 0) {
            w[i + 1][j - 1][t] += d[i][j][t] + w[i][j][t];
          }
        } else {
          if (j < k && t < k) {
            d[i][j + 1][t + 1] += d[i][j][t];
          }
          d[i + 1][j][t] += d[i][j][t] + w[i][j][t];
        }
      }
    }
  }
  mint res = 0;
  for (int t = 0; t <= k; t++) {
    res += d[n][0][t];
    res += w[n][0][t];
  }
  cout << res.value << "\n";

  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
#define long long long int
using namespace std;

// @author: pashka

int mod = 998244353;

struct mint {
  int value;
  constexpr mint() : value() {}
  mint(const long &x) { value = normalize(x); }
  static long normalize(const long &x) {
    long v = x % mod;
    if (v < 0)
      v += mod;
    return v;
  }
  bool operator==(const mint &x) { return value == x.value; };
  mint operator+(const mint &x) { return value + x.value; };
  mint operator*(const mint &x) { return (long)value * x.value; };
  void operator+=(const mint &x) { value = normalize(value + x.value); };
};

mint d[301][301][301];
mint w[301][301][301];

int main() {
  ios::sync_with_stdio(false);

  string s;
  int k;
  cin >> s >> k;
  int n = s.size();
  k = min(k, n);
  d[0][0][0] = 1;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j <= n; j++) {
      for (int t = 0; t <= k; t++) {
        if (d[i][j][t] == 0 && w[i][j][t] == 0)
          continue;
        //                cout << i << " " << j << " " << t << " " <<
        //                d[i][j][t].value << "\n";
        if (s[i] == '1') {
          d[i + 1][j][t] += d[i][j][t];
          if (j > 0) {
            w[i + 1][j - 1][t] += d[i][j][t] + w[i][j][t];
          }
        } else {
          if (j < k && t < k) {
            d[i][j + 1][t + 1] += d[i][j][t];
          }
          d[i + 1][j][t] += d[i][j][t] + w[i][j][t];
        }
      }
    }
  }
  mint res = 0;
  for (int t = 0; t <= k; t++) {
    res += d[n][0][t];
    res += w[n][0][t];
  }
  cout << res.value << "\n";

  return 0;
}