#include<bits/stdc++.h>
            #include<ext/pb_ds/assoc_container.hpp>
            #include<ext/pb_ds/tree_policy.hpp>
            using namespace __gnu_pbds;
            using namespace std;
            # define ll long long
            # define int long long  //comment it out when MLE
           // # define endl "\n"
            template <typename T>
            using ordered_set = tree<T, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>;

            #define gok ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
            //# define m 163577857
            # define mo 1000000007
            # define pi acos(-1)
            # define fi first
            # define se second
            #define REP(i,n) for (int i = 1; i <= n; i++)
            const ll mod =  1e9+7;
            //const int K = 2;
            //typedef vector<vector<int> > matrix;
/*
          int add(int a, int b,int mod) {
                a%=mod;
                b%=mod;
                a += b;
                if (a >= mod) a -= mod;
                if(a<0)
                {
                    a += mod;
                    a %= mod;
                }
                return a;
            }

            int mul(ll a, int b,int mod) {
                a%=mod;
                b%=mod;
                a *= b;
                a += mod;
                return a % mod;
            }
            int po(int a,int b,int mod)
            {
                if(b==0)
                    return 1;
                if(b%2==0)
                    return po(mul(a,a,mod),b/2,mod);
                return mul(a,po(mul(a,a,mod),(b-1)/2,mod),mod);
            }


            ll fact[200003];
            ll inv[200003];

            void fact0()
            {
                int i,j;
                fact[0]=1;
                for(i=1;i<=200000;i++)
                {
                    fact[i]=i*fact[i-1]%mod;
                }
                inv[0]=1;
                inv[1]=1;
                ll p=mod;
                for (i=2; i<=200000; i++)
                    inv[i] = (p - (p/i) * inv[p%i] % p) % p;

                for(i=2;i<=200000;i++)
                {
                    inv[i]*=inv[i-1];
                    inv[i]%=mod;
                }
            }
            int help(int a,int b)
            {
               // cout<<a<<" "<<b<<endl;
                int an = fact[a];
                //cout<<an<<endl;
                an *= inv[b];
                an %= mod;
                an *= inv[a-b];
                an %= mod;
                return an;
            }
/*
          void random()
            {
              srand(time(0));
            for (int i = 0; i < n; i ++)
                perm[i] = i + 1;
            random_shuffle(perm, perm + n);
            }
int ncr(int a,int b)
{
    int tt = fact[a];
    tt %= mod;
    tt *= inv[a-b];
    tt %= mod;
    tt *= inv[b];
    tt %= mod;
    return tt;
}
*/
int pp[3][200005];
int help(int x)
{
    int an=1;
    while(x!=0)
    {
        int tm=x,cc=0;
        while(tm!=0)
        {
            if(tm%2)
                cc++;
            tm/=2;
        }
        x = x%cc;
        an++;
    }
    return an;
}
signed main() {
	gok
    int a=0,b=0,c=0,cc=0,n;
    string s;
    cin>>n>>s;
    for(int i=0;i<n;i++)
    {
        if(s[i]=='1')
            cc++;
    }
    if(cc<=1)
    {
        if(cc==0){
        for(int i=1;i<=n;i++)
        {
            cout<<1<<endl;
        }
        }
        else
        {
           for(int i=0;i<n;i++)
           {
               if(s[i]=='1')
                cout<<0<<endl;
               else
              {
                  if(s[n-1]=='1')
                cout<<2<<endl;
                else{
                    if(i==n-1)
                        cout<<2<<endl;
                    else
                    cout<<1<<endl;
                }
               }
           }
        }
        return 0;
    }
    pp[0][0]=pp[1][0]=pp[2][0]=1;
    for(int i=1;i<=n;i++)
    {
        pp[0][i] = pp[0][i-1]*2;
        pp[1][i] = pp[1][i-1]*2;
        pp[2][i] = pp[2][i-1]*2;
        pp[0][i]%=(cc-1);
        pp[1][i]%=cc;
        pp[2][i]%=(cc+1);
    }
    reverse(s.begin(),s.end());
    for(int i=0;i<n;i++)
    {
        int tt = (s[i]-'0')*pp[0][i];
        tt %= (cc-1);
        a += tt;
        a %= (cc-1);

        tt = (s[i]-'0')*pp[1][i];
        tt %= (cc);
        b += tt;
        b %= (cc);

        tt = (s[i]-'0')*pp[2][i];
        tt %= (cc+1);
        c += tt;
        c %= (cc+1);
    }
   // cout<<a<<" "<<b<<" "<<c<<endl;
    //reverse(s.begin(),s.end());
    vector<int> re;
    for(int i=0;i<n;i++)
    {
        if(s[i]=='1')
        {
            int ex = pp[0][i];
            ex %= (cc-1);
            int tt=a;
            tt -= ex;
            tt += (cc-1);
            tt %= (cc-1);
           // cout<<tt<<" ";
            int an = help(tt);
            re.push_back(an);
        }
        else
        {
           int ex = pp[2][i];
           ex %= (cc+1);
            int tt=c;
            //cout<<tt<<" ";
            tt += ex;
            //cout<<tt<<" ";
            tt += (cc+1);
            tt %= (cc+1);
            //cout<<tt<<" ";
            int an = help(tt);
            re.push_back(an);
        }
    }
    for(int i=n-1;i>=0;i--)
        cout<<re[i]<<endl;



















  return 0;
}


Measured memory_bytes: 10204