Problem p02635 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
#define ull unsigned ll
#define f first
#define s second
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)x.size()
#define SQ(x) (x) * (x)
#define MN(a, b) a = min(a, (__typeof__(a))(b))
#define MX(a, b) a = max(a, (__typeof__(a))(b))
#define pb push_back
#define SORT_UNIQUE(c)                                                         \
  (sort(c.begin(), c.end()),                                                   \
   c.resize(distance(c.begin(), unique(c.begin(), c.end()))))
#ifdef BALBIT
#define IOS()
#define bug(...)                                                               \
  fprintf(stderr, "#%d (%s) = ", __LINE__, #__VA_ARGS__), _do(__VA_ARGS__);
template <typename T> void _do(T &&x) { cerr << x << endl; }
template <typename T, typename... S> void _do(T &&x, S &&...y) {
  cerr << x << ", ";
  _do(y...);
}
#else
#define IOS()                                                                  \
  ios_base::sync_with_stdio(0);                                                \
  cin.tie(0);
#define endl '\n'
#define bug(...)
#endif

const int iinf = 1e9 + 10;
const ll inf = 1ll << 60;
const ll mod = 998244353;

void GG() {
  cout << "0\n";
  exit(0);
}

ll mpow(ll a, ll n, ll mo = mod) { // a^n % mod
  ll re = 1;
  while (n > 0) {
    if (n & 1)
      re = re * a % mo;
    a = a * a % mo;
    n >>= 1;
  }
  return re;
}

ll inv(ll b, ll mo = mod) {
  if (b == 1)
    return b;
  return (mo - mo / b) * inv(mo % b, mo) % mo;
}

const int maxn = 3e2 + 5;

int a[maxn];
ll dp[2][305][305];

signed main() {
  IOS();
  string s;
  cin >> s;
  int n0 = 0, n = SZ(s);
  int k;
  cin >> k;
  int n1 = 0;
  int now = 0;
  int N = 0;
  for (int i = 0; i < n; ++i) {
    (s[i] == '0' ? n0 : n1)++;
    if (s[i] == '0') {
      a[N++] = now;
      now = 0;
    } else
      now++;
  }
  if (now)
    a[N++] = now;
  bug(N);
  for (int i = 0; i < N; ++i)
    bug(i, a[i]);
  bool dpat = 0;
  dp[dpat][0][0] = 1;
  int befsum1 = 0;
  for (int i = N - 1; i >= 0; --i) {
    dpat ^= 1;
    memset(dp[dpat], 0, sizeof dp[dpat]);
    for (int chg = 0; chg <= min(n1, k); ++chg) {
      for (int def = 0; def <= chg; ++def) {
        for (int j = 0; j <= a[i]; ++j) {
          if (def - j >= 0)
            dp[dpat][def][chg] += dp[dpat ^ 1][def - j][chg - j];
          else
            break;
        }
        for (int j = 1; j <= befsum1; ++j) {
          dp[dpat][def][chg] += dp[dpat ^ 1][def + j][chg];
        }
        dp[dpat][def][chg] %= mod;
      }
    }
    befsum1 += a[i];
  }
  ll sig = 0;
  for (int i = 0; i <= min(k, n1); ++i) {
    sig += dp[dpat][0][i];
    bug(i, dp[dpat][0][i]);
  }
  cout << sig % mod << endl;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
#define ull unsigned ll
#define f first
#define s second
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)x.size()
#define SQ(x) (x) * (x)
#define MN(a, b) a = min(a, (__typeof__(a))(b))
#define MX(a, b) a = max(a, (__typeof__(a))(b))
#define pb push_back
#define SORT_UNIQUE(c)                                                         \
  (sort(c.begin(), c.end()),                                                   \
   c.resize(distance(c.begin(), unique(c.begin(), c.end()))))
#ifdef BALBIT
#define IOS()
#define bug(...)                                                               \
  fprintf(stderr, "#%d (%s) = ", __LINE__, #__VA_ARGS__), _do(__VA_ARGS__);
template <typename T> void _do(T &&x) { cerr << x << endl; }
template <typename T, typename... S> void _do(T &&x, S &&...y) {
  cerr << x << ", ";
  _do(y...);
}
#else
#define IOS()                                                                  \
  ios_base::sync_with_stdio(0);                                                \
  cin.tie(0);
#define endl '\n'
#define bug(...)
#endif

const int iinf = 1e9 + 10;
const ll inf = 1ll << 60;
const ll mod = 998244353;

void GG() {
  cout << "0\n";
  exit(0);
}

ll mpow(ll a, ll n, ll mo = mod) { // a^n % mod
  ll re = 1;
  while (n > 0) {
    if (n & 1)
      re = re * a % mo;
    a = a * a % mo;
    n >>= 1;
  }
  return re;
}

ll inv(ll b, ll mo = mod) {
  if (b == 1)
    return b;
  return (mo - mo / b) * inv(mo % b, mo) % mo;
}

const int maxn = 3e2 + 5;

int a[maxn];
ll dp[2][305][305];

signed main() {
  IOS();
  string s;
  cin >> s;
  int n0 = 0, n = SZ(s);
  int k;
  cin >> k;
  int n1 = 0;
  int now = 0;
  int N = 0;
  for (int i = 0; i < n; ++i) {
    (s[i] == '0' ? n0 : n1)++;
    if (s[i] == '0') {
      a[N++] = now;
      now = 0;
    } else
      now++;
  }
  if (now)
    a[N++] = now;
  bug(N);
  for (int i = 0; i < N; ++i)
    bug(i, a[i]);
  bool dpat = 0;
  dp[dpat][0][0] = 1;
  int befsum1 = 0;
  for (int i = N - 1; i >= 0; --i) {
    dpat ^= 1;
    memset(dp[dpat], 0, sizeof dp[dpat]);
    for (int chg = 0; chg <= min(n1, k); ++chg) {
      for (int def = 0; def <= chg; ++def) {
        for (int j = 0; j <= a[i]; ++j) {
          if (def - j >= 0)
            dp[dpat][def][chg] += dp[dpat ^ 1][def - j][chg - j];
          else
            break;
        }
        for (int j = 1; j + def <= befsum1; ++j) {
          dp[dpat][def][chg] += dp[dpat ^ 1][def + j][chg];
        }
        dp[dpat][def][chg] %= mod;
      }
    }
    befsum1 += a[i];
  }
  ll sig = 0;
  for (int i = 0; i <= min(k, n1); ++i) {
    sig += dp[dpat][0][i];
    bug(i, dp[dpat][0][i]);
  }
  cout << sig % mod << endl;
}