#include <bits/stdc++.h>
using namespace std;

#define rep(i, m, n) for(int(i) = (int)(m); i < (int)(n); ++i)
#define rep2(i, m, n) for(int(i) = (int)(n)-1; i >= (int)(m); --i)
#define REP(i, n) rep(i, 0, n)
#define REP2(i, n) rep2(i, 0, n)
#define FOR(i, c) for(decltype((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define all(hoge) (hoge).begin(), (hoge).end()
#define en '\n'
using ll = long long;
using ull = unsigned long long;
template <class T>
using vec = vector<T>;
template <class T>
using vvec = vector<vec<T>>;
typedef pair<ll, ll> P;
constexpr long long INF = 1LL << 60;
constexpr int INF_INT = 1 << 25;
constexpr long long MOD = (ll)1e9 + 7;
//constexpr long long MOD = 998244353LL;
using ld = long double;
static const ld pi = 3.141592653589793L;
typedef vector<ll> Array;
typedef vector<Array> Matrix;

template <class T>
inline bool chmin(T &a, T b) {
    if(a > b) {
        a = b;
        return true;
    }
    return false;
}
template <class T>
inline bool chmax(T &a, T b) {
    if(a < b) {
        a = b;
        return true;
    }
    return false;
}

struct Edge {
    ll to, rev;
    long double cap;
    Edge(ll _to, long double _cap, ll _rev) {
        to = _to;
        cap = _cap;
        rev = _rev;
    }
};
using Edges = vector<Edge>;
using Graph = vector<Edges>;

void add_edge(Graph &G, ll from, ll to, long double cap, bool revFlag, long double revCap) {
    G[from].push_back(Edge(to, cap, (ll)G[to].size()));
    if(revFlag)
        G[to].push_back(Edge(from, revCap, (ll)G[from].size() - 1));
}

void solve() {
    ll n;
    cin >> n;
    string x;
    cin >> x;
    ll con = 0;
    REP(i, n) {
        if(x[i] == '1')
            con++;
    }

    ll sum0 = 0;
    if(con > 1) {
        //減るとき
        REP(i, n) {
            sum0 *= 2;
            sum0 %= (con - 1);
            if(x[i] == '1')
                sum0++;
        }
    }
    ll sum1 = 0;
    {
        //ふえるとき
        REP(i, n) {
            sum1 *= 2;
            sum1 %= (con + 1);
            if(x[i] == '1')
                sum1++;
        }
    }

    vvec<ll> pow2(n + 1, vec<ll>(2, 1));
    if(con > 1) {
        //減るとき
        REP(i, n) {
            pow2[i + 1][0] = pow2[i][0] * 2 % (con - 1);
        }
    }
    REP(i, n) {
        //増える時
        pow2[i + 1][1] = pow2[i][1] * 2 % (con + 1);
    }

    vec<ll> dp(101010, -1);
    auto f = [&](auto &&self, ll xx) -> ll {
        if(dp[xx] != -1)
            return dp[xx];
        if(xx == 0)
            return 0LL;

        ll num = __builtin_popcountll(xx);
        return self(self, xx % num) + 1;
    };

    REP(i, n) {
        if(x[i] == '0') {
            //cout << (sum1 + pow2[n - 1 - i][1]) % (con + 1) << en;
            cout << f(f, (sum1 + pow2[n - 1 - i][1]) % (con + 1)) + 1 << en;
        } else {
            if(con == 1)
                cout << 0 << en;
            else {
                //cout << (sum0 + con - 1 - pow2[n - 1 - i][0]) % (con - 1) << en;
                cout << f(f, (sum0 + con - 1 - pow2[n - 1 - i][0]) % (con - 1)) + 1 << en;
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    solve();
    //ll t;cin>>t;REP(i,t) solve();

    return 0;
}


Measured memory_bytes: 15144