Problem p03397 (C++)

Buggy submission (status: Runtime Error):
// #pragma GCC optimize("trapv")
// #pragma GCC optimize("unroll-loops")
// #pragma GCC target("sse,sse2,tune=native")
#include <bits/stdc++.h>
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define pb push_back
using namespace std;
using ll = long long;
// using arr = array;
using pi = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;
using vpi = vector<pi>;
using ld = long double;
const int maxn = 606, mod = 1e9 + 7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int n, dp[maxn][5][3];
string s;
inline void add(int &i, int j) { (i += j) %= mod; }
int main() {
  cin.tie(0)->sync_with_stdio(0);
  cin >> s;
  n = s.size();
  dp[0][0][0] = 1;
  for (int i = 0; i < n; i++) {
    if (s[i] != '1') {
      for (int x = 0; x < 5; x++)
        for (int y = 0; y < 3; y++)
          add(dp[i + 1][x][y == 1 ? 2 : 1], dp[i][x][y]);
    }
    if (s[i] != '0') {
      add(dp[i + 1][1][0], dp[i][0][0]);
      add(dp[i + 1][0][0], dp[i][0][1]);
      add(dp[i + 1][0][1], dp[i][0][2]);
      add(dp[i + 1][2][0], dp[i][1][0]);
      add(dp[i + 1][1][0], dp[i][1][1]);
      add(dp[i + 1][1][1], dp[i][1][2]);
      add(dp[i + 1][3][0], dp[i][2][0]);
      add(dp[i + 1][2][0], dp[i][2][1]);
      add(dp[i + 1][2][1], dp[i][2][2]);
      add(dp[i + 1][4][0], dp[i][3][0]);
      add(dp[i + 1][3][0], dp[i][3][1]);
      add(dp[i + 1][3][1], dp[i][3][2]);
      add(dp[i + 1][4][0], dp[i][4][0]);
      add(dp[i + 1][4][1], dp[i][4][1]);
      add(dp[i + 1][4][2], dp[i][4][2]);
    }
  }
  int ans = 0;
  for (int x = 0; x < 5; x++)
    for (int y = 0; y < 3; y++)
      if (x > y)
        (ans += dp[n][x][y]) %= mod;
  cout << ans;
}


Fixed submission:
// #pragma GCC optimize("trapv")
// #pragma GCC optimize("unroll-loops")
// #pragma GCC target("sse,sse2,tune=native")
#include <bits/stdc++.h>
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define pb push_back
using namespace std;
using ll = long long;
// using arr = array;
using pi = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;
using vpi = vector<pi>;
using ld = long double;
const int maxn = 3e5, mod = 1e9 + 7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int n, dp[maxn][5][3];
string s;
inline void add(int &i, int j) { (i += j) %= mod; }
int main() {
  cin.tie(0)->sync_with_stdio(0);
  cin >> s;
  n = s.size();
  dp[0][0][0] = 1;
  for (int i = 0; i < n; i++) {
    if (s[i] != '1') {
      for (int x = 0; x < 5; x++)
        for (int y = 0; y < 3; y++)
          add(dp[i + 1][x][y == 1 ? 2 : 1], dp[i][x][y]);
    }
    if (s[i] != '0') {
      add(dp[i + 1][1][0], dp[i][0][0]);
      add(dp[i + 1][0][0], dp[i][0][1]);
      add(dp[i + 1][0][1], dp[i][0][2]);
      add(dp[i + 1][2][0], dp[i][1][0]);
      add(dp[i + 1][1][0], dp[i][1][1]);
      add(dp[i + 1][1][1], dp[i][1][2]);
      add(dp[i + 1][3][0], dp[i][2][0]);
      add(dp[i + 1][2][0], dp[i][2][1]);
      add(dp[i + 1][2][1], dp[i][2][2]);
      add(dp[i + 1][4][0], dp[i][3][0]);
      add(dp[i + 1][3][0], dp[i][3][1]);
      add(dp[i + 1][3][1], dp[i][3][2]);
      add(dp[i + 1][4][0], dp[i][4][0]);
      add(dp[i + 1][4][1], dp[i][4][1]);
      add(dp[i + 1][4][2], dp[i][4][2]);
    }
  }
  int ans = 0;
  for (int x = 0; x < 5; x++)
    for (int y = 0; y < 3; y++)
      if (x > y)
        (ans += dp[n][x][y]) %= mod;
  cout << ans;
}