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 Julia (1.4.0) (judge verdict: Wrong Answer)

function main()
    N = pread(Int)
    X = reverse(pread(String))
    pc = count(x -> x == '1', X)
    cp = parse(Int, X[min(32,N):-1:1], base=2) % (pc + 1)
    for i in 33:32:N
        cp += parse(Int, X[min(i+31,N):-1:i], base=2) << 32 % (pc + 1)
        cp %= (pc + 1)
    end
    ap = zeros(Int, N)
    am = zeros(Int, N)
    ap[1] = 1
    am[1] = 1
    for i in 2:N
        ap[i] = ap[i-1]<<1 % (pc+1)
    end
    cm = 0
    if (pc-1) != 0
        cm = parse(Int, X[min(32,N):-1:1], base=2) % (pc - 1)
        for i in 33:32:N
            cm += parse(Int, X[min(i+31,N):-1:i], base=2) << 32 % (pc - 1)
            cm %= (pc - 1)
        end
        for i in 2:N
            am[i] = am[i-1]<<1 % (pc-1)
        end
    end
    ans = zeros(Int,N)
    for i in 1:N
        c = (X[i]=='1' ? cm : cp)
        ppm = (pc + (X[i]=='1' ? -1 : 1))
        if ppm == 0
            push!(ans, 0)
            continue
        end
        tmp = (ppm + c + (X[i]=='1' ? -am[i] : ap[i])) % ppm
        cc = 1
        while tmp != 0
            tmp = tmp % count_ones(tmp)
            cc += 1
        end
        ans[i] = cc
    end
    for i in N:-1:1
        println(ans[i])
    end
end

import Base.parse
import Base.StringVector

parse(::Type{String},  str::AbstractString) = str
isdelim(x::UInt8, xs::Set{UInt8}) = x in xs
const delimset = Set([0x0a, 0x20])

function myreaduntil(s::IO, delims::Set{UInt8})::Vector{UInt8}
    out = StringVector(0)
    c::UInt8 = 0x00
    while !eof(s)
        c = read(s, UInt8)
        !isdelim(c, delims) && break
    end
    push!(out, c)
    eof(s) && return out
    while !eof(s)
        c = read(s, UInt8)
        isdelim(c, delims) && break
        push!(out, c)
    end
    return out
end

function readword(io::IO = stdin, delims = delimset)::String
    word = myreaduntil(io, delims)
    i = length(word)
    if i == 0 || word[i] != 0x0a
        return String(word)
    elseif i < 2 || word[i-1] != 0x0d
        return String(resize!(word,i-1))
    else
        return String(resize!(word,i-2))
    end
end

pread(ty) = parse(ty, readword())

reads(tys...)::Tuple{tys...} = Tuple{tys...}(pread(ty) for ty in tys)

function readvec(tys::Tuple , len::Signed)::Tuple{map(x -> Vector{x},tys)...}
    rv = Tuple{map(x -> Vector{x},tys)...}(Vector{ty}(undef,len) for ty in tys)
    for i in 1:len
        for j in 1:length(tys)
            @inbounds rv[j][i] = pread(tys[j])
        end
    end
    rv
end

readvec(ty::Type, len::Signed)::Vector{ty} = @inbounds ty[pread(ty) for i in 1:len]

function readmat(ty::Type, s...)::Matrix{ty}
    v = Matrix{ty}(undef, s...)
    @inbounds for i in 1:s[1]
        v[i,:] = readvec(ty, s[2])
    end
    v
end

main()