#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
 #define int long long

#define all(X) (X).begin(), (X).end()
#define reset(X) memset(X, 0, sizeof(X))
#define mp(a, b) make_pair(a, b)
#define pb push_back
#define endl '\n'
#define fi first
#define se second


using namespace __gnu_pbds;
using namespace std;
const int mod=1e9+7;
 // const int mod=998244353;
 // const int mod=1e9+9;
//const int INF=4e18+10;
 const int INF=1e9+10;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template <typename T>
using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define read(n) int n; cin>>n;
#define readv(x, n) vector<int> x(n); for(auto &i:x) cin>>i;


typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef pair<int, int> pii;

template<typename T1,typename T2>
void set_min(T1& a, T2 b)
{
    a=min(a, (T1)b);
}


int multiply(int a, int b, int in_mod){return (a*b)%in_mod;}
int mult_identity(int a){return 1;}


auto power(auto a, int b, int in_mod)
{
    auto prod=mult_identity(a);
    auto mult=a%in_mod;
    while(b!=0)
    {
        if(b%2)
        {
            prod=multiply(prod,mult, in_mod);

        }
        mult=multiply(mult, mult,in_mod);
        b/=2;
    }
    return prod;
}
int mod_inv(int q, int in_mod)
{

    return power(q, in_mod-2,in_mod);
}

void precomp()
{
}


void solve()
{
    int n;
    cin>>n;
    string x;
    cin>>x;
    int cnt = 0;
    for(auto i:x)
        if(i=='1')
            cnt++;

    //water water everywhere not a drop to drink :)

    vector<vector<int>> pref(3, vector<int>( n+1));
    vector<vector<int>> suff(3, vector<int>( n+1));

    for(int i= 0;i<3;i++)
    {
        int mod = cnt -1 + i;
        if(mod)
        for(int j= 1;j<=n;j++)
        {
            pref[i][j] = ((pref[i][j-1]<<1) + x[j-1]-'0')%mod;
            suff[i][j] = ((suff[i][j-1]) + (x[n-j]-'0')*power(2, j-1, mod))%mod;
        }
    }


    for(int i= 0;i<n;i++)
    {
        int mod = cnt - (2*(x[i]-'0') - 1);
        int instance =  (2*('1' - x[i]));


        if(mod == 0)
        {
            cout<<0<<endl;
            continue;
        }


        int val = (((pref[instance][i] << 1) + ('1' -x[i]))*power(2, n-1-i, mod) + suff[instance][n-1-i])%mod;
        int ops = 1;


        while(val)
        {
            val %= __builtin_popcount(val), ops++;
            if(ops>=100)
            {
                assert(val>0);
            }
        }

        cout<<ops<<endl;


    }

}


signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cerr.tie(NULL);
#ifndef ONLINE_JUDGE
    if (fopen("INPUT.txt", "r"))
    {
        freopen("INPUT.txt", "r", stdin);
        freopen("OUTPUT.txt", "w", stdout);
    }
#endif
    auto clk = clock();
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
    // -------------------------------------Code starts here---------------------------------------------------------------------
    precomp();
    int t = 1;
    // cin>>t;

    for (int test = 1; test <= t; test++)
    {
        // cout<<"Case #"<<test<<": ";
        // cout<<endl;
        solve();

        // cout<<endl;
    }

    // -------------------------------------Code ends here------------------------------------------------------------------

    clk = clock() - clk;
    // cerr << fixed << setprecision(6) << "Time: " << ((long double)clk) / CLOCKS_PER_SEC << "\n";
    return 0;
}


Measured memory_bytes: 14504