Problem:
Score : 400 points

Problem Statement

Let \mathrm{popcount}(n) be the number of 1s in the binary representation of n.
For example, \mathrm{popcount}(3) = 2, \mathrm{popcount}(7) = 3, and \mathrm{popcount}(0) = 0.

Let f(n) be the number of times the following operation will be done when we repeat it until n becomes 0: "replace n with the remainder when n is divided by \mathrm{popcount}(n)." (It can be proved that, under the constraints of this problem, n always becomes 0 after a finite number of operations.)

For example, when n=7, it becomes 0 after two operations, as follows:

\mathrm{popcount}(7)=3, so we divide 7 by 3 and replace it with the remainder, 1.

\mathrm{popcount}(1)=1, so we divide 1 by 1 and replace it with the remainder, 0.

You are given an integer X with N digits in binary.
For each integer i such that 1 \leq i \leq N, let X_i be what X becomes when the i-th bit from the top is inverted.
Find f(X_1), f(X_2), \ldots, f(X_N).

Constraints

1 \leq N \leq 2 \times 10^5

X is an integer with N digits in binary, possibly with leading zeros.

Input

Input is given from Standard Input in the following format:

N
X

Output

Print N lines. The i-th line should contain the value f(X_i).

Sample Input 1

3
011

Sample Output 1

2
1
1

X_1 = 7, which will change as follows: 7 \rightarrow 1 \rightarrow 0. Thus, f(7) = 2.

X_2 = 1, which will change as follows: 1 \rightarrow 0. Thus, f(1) = 1.

X_3 = 2, which will change as follows: 2 \rightarrow 0. Thus, f(2) = 1.

Sample Input 2

23
00110111001011011001110

Sample Output 2

2
1
2
2
1
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
1
3

Solution in Python (3.8.2) (judge verdict: Runtime Error)

## coding: UTF-8
#N = 23
#S = '00110111001011011001110'
#N = 7
#S = '1010111'

N = int(input())
S = input()
P = int(S, 2)
#print(P)

def popcount(x):

    # 2bitごとの組に分け、立っているビット数を2bitで表現する
    x = x - ((x >> 1) & 0x5555555555555555)

    # 4bit整数に 上位2bit + 下位2bit を計算した値を入れる
    x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333)

    x = (x + (x >> 4)) & 0x0f0f0f0f0f0f0f0f # 8bitごと
    x = x + (x >> 8) # 16bitごと
    x = x + (x >> 16) # 32bitごと
    x = x + (x >> 32) # 64bitごと = 全部の合計
    return x & 0x0000007f


def count(N):
    warareru = N
    waru = popcount(N)
    counter = 0
    while warareru > 0:
        warareru = warareru % waru
        waru = popcount(warareru)
        counter += 1
    return counter


#前処理
first_popcount = popcount(P)
if(first_popcount == N):
    first_use_pop = [N-1, N-1]
elif(first_popcount == 0):
    first_use_pop = [1, 1]
else:
    first_use_pop = [first_popcount+1, first_popcount-1]

tmp_0 = 1
tmp_1 = 1
kakunou_0 = []
kakunou_1 = []
tmp_0 %= first_use_pop[0]
tmp_1 %= first_use_pop[1]
kakunou_0.append(tmp_0)
kakunou_1.append(tmp_1)
for i in range(0, 2*10**5+10):
    tmp_0 *= 2
    tmp_1 *= 2
    tmp_0 %= first_use_pop[0]
    tmp_1 %= first_use_pop[1]
    kakunou_0.append(tmp_0)
    kakunou_1.append(tmp_1)
#print(first_popcount, first_use_pop, kakunou_0[:50], kakunou_1[:50])


#与えられた数字の初手処理をしておく
syote_0 = 0
syote_1 = 0
#print(S)
for i in range(N-1, -1, -1):
    #print(i, N-1-i, S[i])
    if(S[i] == '1'):
        syote_0 += kakunou_0[N-1-i]
        syote_0 %= first_use_pop[0]
        syote_1 += kakunou_1[N-1-i]
        syote_1 %= first_use_pop[1]
#print(P)
#print(syote_0, syote_1)
#確認OK
#print(P%first_use_pop[0], P%first_use_pop[1])


ans = []
#n = []
for i in range(N):
    if(S[i] == '0'):
        now = syote_0 + kakunou_0[N-1-i]
        now %= first_use_pop[0]
        #n.append(now)
        #if(now == 0):
            #ans.append(1)
        #else:
        ans.append(1+count(now))
    else:
        now = syote_1 - kakunou_1[N-1-i]
        now %= first_use_pop[1]
        #n.append(now)
        #if(now == 0):
            #ans.append(1)
        #else:
        ans.append(1+count(now))

#print('~~~~~~~~~~~~~~~~~~~~')
for i in range(N):
    print(ans[i])



'''
ans = [0]
for i in range(1, 2*10**5+10):
    ans.append(count(i))
#print(ans[:100])
#print(ans)

for i in range(100):
    max = 2 ** (2*10**5 - 1) - 1 - i
    #print(count(max))


C = popcount(P)
ret = []
for i in range(N):
    new = []
    for j in range(N):
        if(j != i):
            new.append(S[j])
        else:
            if(S[j] == '0'):
                new.append('1')
                count = C + 1
            else:
                new.append('0')
                count = C - 1
    ten = int(''.join(new), 2)
    res = ans[ten%count] + 1
    ret.append(res)


for i in range(N):
    print(ret[i])
'''