Problem p03051 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
// #include "bits/stdc++.h"
using namespace std;
typedef long long ll;
// #include "boost/multiprecision/cpp_int.hpp"
// typedef boost::multiprecision::cpp_int LL;
typedef long double dd;
#define i_7 (ll)(1E9 + 7)
// #define i_7 998244353
#define i_5 i_7 - 2

ll mod(ll a) {
  ll c = a % i_7;
  if (c >= 0)
    return c;
  return c + i_7;
}
typedef pair<ll, ll> l_l;
typedef pair<dd, dd> d_d;
ll inf = (ll)1E16;
#define rep(i, l, r) for (ll i = l; i <= r; i++)
#define pb push_back
ll max(ll a, ll b) {
  if (a < b)
    return b;
  else
    return a;
}
ll min(ll a, ll b) {
  if (a > b)
    return b;
  else
    return a;
}
void Max(ll &pos, ll val) { pos = max(pos, val); } // Max(dp[n],dp[n-1]);
void Min(ll &pos, ll val) { pos = min(pos, val); }
void Add(ll &pos, ll val) { pos = mod(pos + val); }
dd EPS = 1E-9;
#define fastio                                                                 \
  ios::sync_with_stdio(false);                                                 \
  cin.tie(0);                                                                  \
  cout.tie(0);
#define fi first
#define se second
#define endl "\n"
#define SORT(v) sort(v.begin(), v.end())
#define ERASE(v) v.erase(unique(v.begin(), v.end()), v.end())
#define POSL(v, x) (lower_bound(v.begin(), v.end(), x) - v.begin())
#define POSU(v, x) (upper_bound(v.begin(), v.end(), x) - v.begin())
// template<class T>void max(T a,T b){if(a<b)return b;else return a;}
// template<class T>void min(T a,T b){if(a>b)return b;else return a;}
// template<class T>bool Max(T&a, T b){if(a < b){a = b;return 1;}return 0;}
// template<class T>bool Min(T&a, T b){if(a > b){a = b;return 1;}return 0;}

//////////////////////////

ll po(ll i, ll p) {
  if (p == 0)
    return 1;
  else {
    i = mod(i);
    if (p == 1)
      return i;
    if (p % 2 == 0)
      return po(mod(i * i), p / 2);
    return mod(i * po(i, p - 1));
  }
}
ll bunbo(ll n) { return po(n, i_5); }

// #define N (1<<20)
#define N 16

int main() {
  fastio ll n;
  cin >> n;
  ll a[n];
  rep(i, 0, n - 1) cin >> a[i];
  ll s[n];
  s[0] = a[0];
  rep(i, 1, n - 1) s[i] = s[i - 1] ^ a[i];

  ll dp[N][2];
  memset(dp, 0, sizeof(dp));
  rep(i, 1, N - 1) dp[i][0] = 1;
  ll cntsum = 0;
  ll cnt[N];
  memset(cnt, 0, sizeof(cnt));

  rep(i, 0, n - 1) {
    if (s[i] == 0) {
      /*
      rep(x,1,N-1){
          if(i<=last[x]){
              dp[x][0]+=dp[x][1];
          }
      }*/
      /*
      rep(x,1,N-1){
          cnt[x]++;
      }*/
      cntsum++;
    } else {
      ll x = s[i];
      // dp[x][1]+=dp[x][0];
      /*
      dp[x][0]+=cnt[x]*dp[x][1];
      cnt[x]=0;
      dp[x][1]+=dp[x][0];*/
      Add(dp[x][0], (cntsum - cnt[x]) * dp[x][1]);
      cnt[x] = cntsum;
      Add(dp[x][1], dp[x][0]);
    }
  }

  // rep(i,0,n-1)cout<<s[i]<<" ";cout<<endl;
  // rep(i,1,N-1)cout<<i<<":"<<dp[i][0]<<" "<<dp[i][1]<<endl;

  if (s[n - 1] == 0) {
    /*
    ll last[N];memset(last,-1,sizeof(last));
    rep(i,0,n-1){
        last[s[i]]=i;
    }*/

    ll ans = po(2, cntsum - 1);
    rep(i, 1, N - 1) { Add(ans, dp[i][1]); }
    cout << mod(ans) << endl;

  } else {
    cout << mod(dp[s[n - 1]][0]) << endl;
  }

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
// #include "bits/stdc++.h"
using namespace std;
typedef long long ll;
// #include "boost/multiprecision/cpp_int.hpp"
// typedef boost::multiprecision::cpp_int LL;
typedef long double dd;
#define i_7 (ll)(1E9 + 7)
// #define i_7 998244353
#define i_5 i_7 - 2

ll mod(ll a) {
  ll c = a % i_7;
  if (c >= 0)
    return c;
  return c + i_7;
}
typedef pair<ll, ll> l_l;
typedef pair<dd, dd> d_d;
ll inf = (ll)1E16;
#define rep(i, l, r) for (ll i = l; i <= r; i++)
#define pb push_back
ll max(ll a, ll b) {
  if (a < b)
    return b;
  else
    return a;
}
ll min(ll a, ll b) {
  if (a > b)
    return b;
  else
    return a;
}
void Max(ll &pos, ll val) { pos = max(pos, val); } // Max(dp[n],dp[n-1]);
void Min(ll &pos, ll val) { pos = min(pos, val); }
void Add(ll &pos, ll val) { pos = mod(pos + val); }
dd EPS = 1E-9;
#define fastio                                                                 \
  ios::sync_with_stdio(false);                                                 \
  cin.tie(0);                                                                  \
  cout.tie(0);
#define fi first
#define se second
#define endl "\n"
#define SORT(v) sort(v.begin(), v.end())
#define ERASE(v) v.erase(unique(v.begin(), v.end()), v.end())
#define POSL(v, x) (lower_bound(v.begin(), v.end(), x) - v.begin())
#define POSU(v, x) (upper_bound(v.begin(), v.end(), x) - v.begin())
// template<class T>void max(T a,T b){if(a<b)return b;else return a;}
// template<class T>void min(T a,T b){if(a>b)return b;else return a;}
// template<class T>bool Max(T&a, T b){if(a < b){a = b;return 1;}return 0;}
// template<class T>bool Min(T&a, T b){if(a > b){a = b;return 1;}return 0;}

//////////////////////////

ll po(ll i, ll p) {
  if (p == 0)
    return 1;
  else {
    i = mod(i);
    if (p == 1)
      return i;
    if (p % 2 == 0)
      return po(mod(i * i), p / 2);
    return mod(i * po(i, p - 1));
  }
}
ll bunbo(ll n) { return po(n, i_5); }

#define N (1 << 20)
// #define N 16

int main() {
  fastio ll n;
  cin >> n;
  ll a[n];
  rep(i, 0, n - 1) cin >> a[i];
  ll s[n];
  s[0] = a[0];
  rep(i, 1, n - 1) s[i] = s[i - 1] ^ a[i];

  ll dp[N][2];
  memset(dp, 0, sizeof(dp));
  rep(i, 1, N - 1) dp[i][0] = 1;
  ll cntsum = 0;
  ll cnt[N];
  memset(cnt, 0, sizeof(cnt));

  rep(i, 0, n - 1) {
    if (s[i] == 0) {
      /*
      rep(x,1,N-1){
          if(i<=last[x]){
              dp[x][0]+=dp[x][1];
          }
      }*/
      /*
      rep(x,1,N-1){
          cnt[x]++;
      }*/
      cntsum++;
    } else {
      ll x = s[i];
      // dp[x][1]+=dp[x][0];
      /*
      dp[x][0]+=cnt[x]*dp[x][1];
      cnt[x]=0;
      dp[x][1]+=dp[x][0];*/
      Add(dp[x][0], (cntsum - cnt[x]) * dp[x][1]);
      cnt[x] = cntsum;
      Add(dp[x][1], dp[x][0]);
    }
  }

  // rep(i,0,n-1)cout<<s[i]<<" ";cout<<endl;
  // rep(i,1,N-1)cout<<i<<":"<<dp[i][0]<<" "<<dp[i][1]<<endl;

  if (s[n - 1] == 0) {
    /*
    ll last[N];memset(last,-1,sizeof(last));
    rep(i,0,n-1){
        last[s[i]]=i;
    }*/

    ll ans = po(2, cntsum - 1);
    rep(i, 1, N - 1) { Add(ans, dp[i][1]); }
    cout << mod(ans) << endl;

  } else {
    cout << mod(dp[s[n - 1]][0]) << endl;
  }

  return 0;
}