using System;
//毎回PopCount求めると時間足りない..
//110100110(2)=422(10)とするとPC=5
//なのでほかのPCは3(1->0)か4(0->1)になる
//早い段階であまりだけ取ることが計算量を減らすためのポイント
class Program
{
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        string s = Console.ReadLine();
        int[] X = new int[n];
        for (int i = 0; i < n; i++)
        {
            X[i] = s[i]-'0';
        }
        //元の数のPCを求める
        int pc = 0;
        foreach (var x in X) pc += x;
        //0->1か1->0の分岐
        int[] Ans = new int[n];
        for(int b = 0; b < 2; b++)
        {
            int npc = pc;
            if (b == 0) npc++;//0->1
            else npc--;//1->0
            if (npc <= 0) continue;
            //2進を10進に戻しつつ、余りをとる
            int r0 = 0;//元の割った余り
            for (int i = 0; i < n; i++)
            {
                r0 = (2 * r0) %npc;
                r0 += X[i];
            }
            //置き換え
            int k = 1;
            for(int i = n - 1; i >= 0; i--)
            {
                int r;
                if (X[i] == b){
                    if (b == 0) r = (r0 + k) % npc;
                    else r = (r0 - k + npc) % npc;
                    Ans[i] = F(r) + 1;
                }
                k = (2 * k) % npc;
            }
        }
        for(int i = 0; i < n; i++)
        {
            Console.WriteLine(Ans[i]);
        }
    }
    static public int F(int x)
    {
        if (x == 0) return 0;
        return F(x % Pcnt(x)) + 1;
    }
    static public int Pcnt(int z)
    {
        int ret = 0;
        while (z > 0)
        {
            if (z % 2 == 1) ret++;
            z /= 2;
        }
        return ret;
    }
}
//TLE
//class Program
//{
//    static void Main()
//    {
//        int n = int.Parse(Console.ReadLine());
//        string x = Console.ReadLine();
//        int v = 0;
//        for(int i = 0; i < n; i++)
//        {
//            if(x[n - i - 1]=='1')v += (int)Math.Pow(2, i);
//        }
//        for(int i=0; i < n; i++)
//        {
//            int temp = v;
//            if (x[i] == '1') temp -= (int)Math.Pow(2, n-i-1);
//            if (x[i] == '0') temp += (int)Math.Pow(2, n-i-1);
//            int cnt = 0;
//            while (temp > 0)
//            {
//                int p=Popcount(temp);
//                temp %= p;
//                cnt++;
//            }
//            Console.WriteLine(cnt);
//        }
//    }
//    static public int Popcount(int z)
//    {
//        int ret = 0;
//        while (z > 0)
//        {
//            if (z % 2 == 1) ret++;
//            z /= 2;
//        }
//        return ret;
//    }
//}
//namespace C
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            int n = int.Parse(Console.ReadLine());
//            string x = Console.ReadLine();
//            for (int i = 0; i < n; i++)
//            {
//                int t = 0;
//                for (int j = 0; j < n; j++)
//                {
//                    int p = (int)Math.Pow(2, j);
//                    if (n - j - 1 == i)
//                    {
//                        if (x[n - j - 1] == '0') t += 1 * p;
//                    }
//                    else
//                    {
//                        if (x[n - j - 1] == '1') t += 1 * p;
//                    }
//                }
//                int cnt = 0;
//                for (; ; )
//                {
//                    int r = Popcount(t);
//                    if (r == 0) break;
//                    cnt++;
//                    t %= r;
//                }
//                Console.WriteLine(cnt);
//            }

//        }
//        static public int Popcount(int z)
//        {
//            int ret = 0;
//            while (z > 0)
//            {
//                if (z % 2 == 1) ret++;
//                z /= 2;
//            }
//            return ret;
//        }

//    }
//}

Measured memory_bytes: 29568