Problem p02609 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rrep(i, n) for (int i = (int)(n - 1); i >= 0; i--)
#define all(x) (x).begin(), (x).end()
#define sz(x) int(x.size())
#define get_unique(x) x.erase(unique(all(x)), x.end());
typedef long long ll;
typedef complex<double> Complex;
const int INF = 1e9;
const ll MOD = 1e9 + 7;
const ll LINF = 1e18;
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> vector<T> make_vec(size_t a) { return vector<T>(a); }
template <class T, class... Ts> auto make_vec(size_t a, Ts... ts) {
  return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));
}
template <typename T> ostream &operator<<(ostream &os, vector<T> v) {
  for (int i = 0; i < sz(v); i++) {
    os << v[i];
    if (i < sz(v) - 1)
      os << " ";
  }
  return os;
}
int main() {
  int n;
  string s;
  cin >> n >> s;
  int cnt = 0;
  rep(i, n) cnt += s[i] - '0';
  map<int, int> x;
  for (int d = cnt - 1; d <= cnt + 1; d++) {
    rep(i, n) {
      x[d] <<= 1;
      x[d] += s[i] - '0';
      x[d] %= d;
    }
  }

  map<int, vector<int>> mp;
  for (int d = cnt - 1; d <= cnt + 1; d++) {
    mp[d].resize(n);
    if (d == 0)
      continue;
    int k = 1;
    rep(i, n) {
      mp[d][i] = k;
      k <<= 1;
      k %= d;
    }
  }

  rep(i, n) {
    if (s[i] == '0') {
      int xx = (x[cnt + 1] + mp[cnt + 1][n - 1 - i]) % (cnt + 1);
      int ans = 1;
      while (xx) {
        xx %= __builtin_popcount(xx);
        ans++;
      }
      cout << ans << endl;
    } else {
      if (cnt == 1) {
        cout << 0 << endl;
        continue;
      }
      int xx = (x[cnt - 1] - mp[cnt - 1][n - 1 - i] + cnt - 1) % (cnt - 1);
      int ans = 1;
      while (xx) {
        xx %= __builtin_popcount(xx);
        ans++;
      }
      cout << ans << endl;
    }
  }
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rrep(i, n) for (int i = (int)(n - 1); i >= 0; i--)
#define all(x) (x).begin(), (x).end()
#define sz(x) int(x.size())
#define get_unique(x) x.erase(unique(all(x)), x.end());
typedef long long ll;
typedef complex<double> Complex;
const int INF = 1e9;
const ll MOD = 1e9 + 7;
const ll LINF = 1e18;
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> vector<T> make_vec(size_t a) { return vector<T>(a); }
template <class T, class... Ts> auto make_vec(size_t a, Ts... ts) {
  return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));
}
template <typename T> ostream &operator<<(ostream &os, vector<T> v) {
  for (int i = 0; i < sz(v); i++) {
    os << v[i];
    if (i < sz(v) - 1)
      os << " ";
  }
  return os;
}
int main() {
  int n;
  string s;
  cin >> n >> s;
  int cnt = 0;
  rep(i, n) cnt += s[i] - '0';
  map<int, int> x;
  for (int d = cnt - 1; d <= cnt + 1; d++) {
    if (d == 0)
      continue;
    rep(i, n) {
      x[d] <<= 1;
      x[d] += s[i] - '0';
      x[d] %= d;
    }
  }

  map<int, vector<int>> mp;
  for (int d = cnt - 1; d <= cnt + 1; d++) {
    mp[d].resize(n);
    if (d == 0)
      continue;
    int k = 1;
    rep(i, n) {
      mp[d][i] = k;
      k <<= 1;
      k %= d;
    }
  }

  rep(i, n) {
    if (s[i] == '0') {
      int xx = (x[cnt + 1] + mp[cnt + 1][n - 1 - i]) % (cnt + 1);
      int ans = 1;
      while (xx) {
        xx %= __builtin_popcount(xx);
        ans++;
      }
      cout << ans << endl;
    } else {
      if (cnt == 1) {
        cout << 0 << endl;
        continue;
      }
      int xx = (x[cnt - 1] - mp[cnt - 1][n - 1 - i] + cnt - 1) % (cnt - 1);
      int ans = 1;
      while (xx) {
        xx %= __builtin_popcount(xx);
        ans++;
      }
      cout << ans << endl;
    }
  }
}