Problem p02609 (C++) — buggy submission, verdict: Runtime Error

#include "bits/stdc++.h"
using namespace std;
#ifndef LOCAL
#define endl '\\n'
#endif

#define fr(i, a, b) for (int i = a; i <= b; i++)
#define rf(i, a, b) for (int i = a; i >= b; i--)
#define pf push_front
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define sz(x) (int)x.size()
#define lb lower_bound
#define ub upper_bound

typedef long long ll;
typedef long double f80;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

int pct(int x) { return __builtin_popcount(x); }
int pct(ll x) { return __builtin_popcountll(x); }
int bt(int x) { return 31 - __builtin_clz(x); }  // floor(log2(x))
int bt(ll x) { return 63 - __builtin_clzll(x); } // floor(log2(x))
int cdiv(int a, int b) { return a / b + !(a < 0 || a % b == 0); }
ll cdiv(ll a, ll b) { return a / b + !(a < 0 || a % b == 0); }
int nxt_C(int x) {
  int c = x & -x, r = x + c;
  return (((r ^ x) >> 2) / c) | r;
}
ll nxt_C(ll x) {
  ll c = x & -x, r = x + c;
  return (((r ^ x) >> 2) / c) | r;
}

vector<int> get_bits(int mask) {
  vector<int> bb;
  while (mask) {
    int b = bt(mask);
    bb.pb(b);
    mask ^= (1 << b);
  }
  reverse(all(bb));
  return bb;
}

int get_mask(vector<int> v) {
  int mask = 0;
  for (int x : v) {
    mask ^= (1 << x);
  }
  return mask;
}

template <typename T> void uniq(vector<T> &v) {
  sort(all(v));
  v.resize(unique(all(v)) - v.begin());
}

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

ll rand(ll l, ll r) {
  uniform_int_distribution<ll> uid(l, r);
  return uid(rng);
}

void sc() {}

template <typename Head, typename... Tail> void sc(Head &H, Tail &...T) {
  cin >> H;
  sc(T...);
}

#ifdef LOCAL
#define debug(...)                                                             \\
  cerr << "[L:" << __LINE__ << "][" << #__VA_ARGS__ << "]:",                   \\
      debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif

// #ifndef LOCAL
// string to_string(__int128 x) {
// 	string s = "";
// 	bool neg = 0;
// 	if(x < 0) { s += "-"; neg = 1; x = -x; }
// 	if(!x) s += '0';
// 	while(x) {
// 		int rem = x % 10;
// 		s += to_string(rem);
// 		x /= 10;
// 	}
// 	reverse(s.begin() + neg, s.end());
// 	return s;
// }
// #endif

const int mod = 1e9 + 7; // 998244353;

int pwr(int a, ll b) {
  int ans = 1;
  while (b) {
    if (b & 1)
      ans = (ans * 1LL * a) % mod;
    a = (a * 1LL * a) % mod;
    b >>= 1;
  }
  return ans;
}

/*
        Lookout for overflows!!
        Check array sizes!!
        Clear before test cases!!
        Use the correct modulo!!
        Check for corner cases!!
        Are you forgetting something?!
        Read problem statement carefully!!!
*/

const int N = 2e5 + 5;
int f[N];

int pw[3][N];

void solve() {
  int n;
  sc(n);
  for (int i = 1; i <= n; i++) {
    int j = i % pct(i);
    f[i] = f[j] + 1;
    assert(j < i);
  }
  string s;
  sc(s);
  // fr(i, 1, n) {
  //     s += char('0' + rand(0, 1));
  // }
  reverse(all(s));
  int tot = 0;
  for (char ch : s) {
    tot += (ch == '1');
  }
  vector<int> mods;
  if (tot > 0)
    mods.pb(tot);
  if (tot > 1)
    mods.pb(tot - 1);
  if (tot < n)
    mods.pb(tot + 1);
  vector<int> val(sz(mods));
  debug(mods);
  fr(i, 0, sz(mods) - 1) {
    int md = mods[i];
    pw[i][0] = 1 % md;
    fr(j, 1, n) { pw[i][j] = (pw[i][j - 1] << 1) % md; }
    fr(j, 0, n - 1) {
      if (s[j] == '1')
        val[i] = (val[i] + pw[i][j]) % md;
    }
  }
  vector<int> ans;
  for (int i = 0; i < n; i++) {
    int cur = tot + (s[i] == '0') - (s[i] == '1');
    if (cur == 0) {
      ans.pb(0);
      continue;
    }
    int j = -1;
    fr(k, 0, sz(mods) - 1) {
      if (mods[k] == cur)
        j = k;
    }
    assert(j != -1);
    int curval = val[j];
    if (s[i] == '0') {
      curval = (curval + pw[j][i]) % cur;
    } else {
      curval = (curval - pw[j][i] + cur) % cur;
    }
    ans.pb(1 + f[curval]);
  }
  reverse(all(ans));
  for (int x : ans) {
    cout << x << endl;
  }
}

int main() {
  ios ::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int t = 1;
  // cin >> t;
  for (int tt = 1; tt <= t; tt++) {
    solve();
  }
  return 0;
}

Error: 0

Fixed submission:

#include "bits/stdc++.h"
using namespace std;
#ifndef LOCAL
#define endl '\\n'
#endif

#define fr(i, a, b) for (int i = a; i <= b; i++)
#define rf(i, a, b) for (int i = a; i >= b; i--)
#define pf push_front
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define sz(x) (int)x.size()
#define lb lower_bound
#define ub upper_bound

typedef long long ll;
typedef long double f80;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

int pct(int x) { return __builtin_popcount(x); }
int pct(ll x) { return __builtin_popcountll(x); }
int bt(int x) { return 31 - __builtin_clz(x); }  // floor(log2(x))
int bt(ll x) { return 63 - __builtin_clzll(x); } // floor(log2(x))
int cdiv(int a, int b) { return a / b + !(a < 0 || a % b == 0); }
ll cdiv(ll a, ll b) { return a / b + !(a < 0 || a % b == 0); }
int nxt_C(int x) {
  int c = x & -x, r = x + c;
  return (((r ^ x) >> 2) / c) | r;
}
ll nxt_C(ll x) {
  ll c = x & -x, r = x + c;
  return (((r ^ x) >> 2) / c) | r;
}

vector<int> get_bits(int mask) {
  vector<int> bb;
  while (mask) {
    int b = bt(mask);
    bb.pb(b);
    mask ^= (1 << b);
  }
  reverse(all(bb));
  return bb;
}

int get_mask(vector<int> v) {
  int mask = 0;
  for (int x : v) {
    mask ^= (1 << x);
  }
  return mask;
}

template <typename T> void uniq(vector<T> &v) {
  sort(all(v));
  v.resize(unique(all(v)) - v.begin());
}

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

ll rand(ll l, ll r) {
  uniform_int_distribution<ll> uid(l, r);
  return uid(rng);
}

void sc() {}

template <typename Head, typename... Tail> void sc(Head &H, Tail &...T) {
  cin >> H;
  sc(T...);
}

#ifdef LOCAL
#define debug(...)                                                             \\
  cerr << "[L:" << __LINE__ << "][" << #__VA_ARGS__ << "]:",                   \\
      debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif

// #ifndef LOCAL
// string to_string(__int128 x) {
// 	string s = "";
// 	bool neg = 0;
// 	if(x < 0) { s += "-"; neg = 1; x = -x; }
// 	if(!x) s += '0';
// 	while(x) {
// 		int rem = x % 10;
// 		s += to_string(rem);
// 		x /= 10;
// 	}
// 	reverse(s.begin() + neg, s.end());
// 	return s;
// }
// #endif

const int mod = 1e9 + 7; // 998244353;

int pwr(int a, ll b) {
  int ans = 1;
  while (b) {
    if (b & 1)
      ans = (ans * 1LL * a) % mod;
    a = (a * 1LL * a) % mod;
    b >>= 1;
  }
  return ans;
}

/*
        Lookout for overflows!!
        Check array sizes!!
        Clear before test cases!!
        Use the correct modulo!!
        Check for corner cases!!
        Are you forgetting something?!
        Read problem statement carefully!!!
*/

const int N = 2e5 + 5;
int f[N];

int pw[3][N];

void solve() {
  int n;
  sc(n);
  for (int i = 1; i <= n; i++) {
    int j = i % pct(i);
    f[i] = f[j] + 1;
    assert(j < i);
  }
  string s;
  sc(s);
  reverse(all(s));
  int tot = 0;
  for (char ch : s) {
    tot += (ch == '1');
  }
  vector<int> mods = {tot};
  if (tot > 1)
    mods.pb(tot - 1);
  if (tot < n)
    mods.pb(tot + 1);
  vector<int> val(sz(mods));
  debug(mods);
  fr(i, 0, sz(mods) - 1) {
    int md = mods[i];
    pw[i][0] = 1 % md;
    fr(j, 1, n) { pw[i][j] = (pw[i][j - 1] << 1) % md; }
    fr(j, 0, n - 1) {
      if (s[j] == '1')
        val[i] = (val[i] + pw[i][j]) % md;
    }
  }
  vector<int> ans;
  for (int i = 0; i < n; i++) {
    int cur = tot + (s[i] == '0') - (s[i] == '1');
    if (cur == 0) {
      ans.pb(0);
      continue;
    }
    int j = -1;
    fr(k, 0, sz(mods) - 1) {
      if (mods[k] == cur)
        j = k;
    }
    assert(j != -1);
    int curval = val[j];
    if (s[i] == '0') {
      curval = (curval + pw[j][i]) % cur;
    } else {
      curval = (curval - pw[j][i] + cur) % cur;
    }
    ans.pb(1 + f[curval]);
  }
  reverse(all(ans));
  for (int x : ans) {
    cout << x << endl;
  }
}

int main() {
  ios ::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int t = 1;
  // cin >> t;
  for (int tt = 1; tt <= t; tt++) {
    solve();
  }
  return 0;
}