#include <bits/stdc++.h>
using namespace std;
#define _GLIBCXX_DEBUG //GCC5.4.1で配列の範囲外アクセスをエラーにする

//cmdで g++ test.cpp とするとコンパイルできる
//制限1秒なら10^6は余裕 10^7は多分間に合う 10^8はよほど単純でないと厳しい

#define ALL(x) x.begin(),x.end()
#define get_tp(t,i) get<i>(t)
#define len(x) (ll)(x.size())
#define ub(a,x) (upper_bound(ALL(a),x)-a.begin())
#define lb(a,x) (lower_bound(ALL(a),x)-a.begin())
typedef long long ll; //long long
typedef pair<int,int> pii; //pair<int,int>
typedef pair<long long,long long> pllll; //pair<ll,ll>
typedef vector<int> vi; //vector<int>
typedef vector<vector<int>> vvi; //vector<vector<int>>
typedef vector<ll> vll; //vector<long long>
typedef vector<vector<ll>> vvll; //vector<vector<long long>>
typedef priority_queue<int, vector<int>, greater<int> > gpq; //逆順priority_queue
typedef priority_queue<int> pq;

//const int MOD=998244353;
const int MOD=1000000007; //10^9+7
const long double PI=3.1415926535897932;

void calc(ll val,ll &step){
    if(val==0){
        return;
    }
    step++;
    ll pcount=0;
    ll valcopy=val;
    while(val>0){
        if(val&0x00000001)pcount++;
        val>>=1;
    }
    //cout<<"v="<<val<<", pc="<<pcount<<endl;
    calc(valcopy%pcount,step);
}

int main(){
    ll N;cin>>N;
    string X;cin>>X;
    reverse(ALL(X));
    //cout<<N<<","<<X<<endl;
    ll pc_x=0;
    for(ll i=0;i<N;i++){
        if(X[i]=='1')pc_x++;
    }
    //cout<<pc_x<<endl;
    
    if(pc_x>=2){
        //mod_pc_xp Xを(pc_x+1)で割ったあまり
        ll mod_pc_xp=0;
        ll mod_pow=1; //(2^n)%(pc_x+1)
        for(ll i=0;i<N;i++){
            if(X[i]=='1'){
                mod_pc_xp+=mod_pow;
                mod_pc_xp%=(pc_x+1);
            }
            mod_pow*=2;
            mod_pow%=(pc_x+1);
        }
    
        //mod_pc_xm Xを(pc_x-1)で割ったあまり
        ll mod_pc_xm=0;
        mod_pow=1; //(2^n)%(pc_x+1)
        for(ll i=0;i<N;i++){
            if(X[i]=='1'){
                mod_pc_xm+=mod_pow;
                mod_pc_xm%=(pc_x-1);
            }
            mod_pow*=2;
            mod_pow%=(pc_x-1);
        }
        //cout<<pc_x<<endl;
        //cout<<mod_pc_xp<<","<<mod_pc_xm<<endl;

        mod_pow=1;
        vll mod_bit_p(N);
        mod_bit_p[0]=1;
        vll mod_bit_m(N);
        mod_bit_m[0]=1;
        for(ll i=1;i<N;i++){
            mod_bit_p[i]=(mod_bit_p[i-1]*2)%(pc_x+1);
            mod_bit_m[i]=(mod_bit_m[i-1]*2)%(pc_x-1);
        }
        
        //cout<<"foo"<<endl;
        for(ll i=N-1;i>=0;i--){
            ll ans=0;
            ll mm;
            if(X[i]=='0'){
                mm=mod_pc_xp+mod_bit_p[i];
                mm%=pc_x+1;
                ans+=1;
            }else{
                mm=mod_pc_xm-mod_bit_m[i];
                while(mm<0){
                    mm+=pc_x-1;
                }
                mm%=pc_x-1;
                ans+=1;
            }

            calc(mm,ans);
            //cout<<mm<<" , "<<ans<<endl;
            cout<<ans<<endl;
        }

    }else if(pc_x==1){
        //唯一の1を反転するときは当然0
        int one_pos;
        for(int i=0;i<N;i++){
            if(X[i]=='1'){
                one_pos=i;break;
            }
        }
        if(one_pos==0){
            for(int i=0;i<N-1;i++){
                cout<<2<<endl;
            }
            cout<<0<<endl;
        }else{
            for(int i=N-1;i>=0;i--){
                if(i==one_pos){
                    cout<<0<<endl;
                }else if(i==0){
                    cout<<2<<endl;
                }else{
                    cout<<1<<endl;
                }
            }
        }
    }else{
        //全部0だったら当然1
        for(int i=0;i<N;i++){
            cout<<1<<endl;
        }
    }
}


Measured memory_bytes: 6804