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 Rust (1.42.0) (judge verdict: Accepted)

use std::cmp;
use std::fmt::Debug;
use std::str::FromStr;
#[allow(dead_code)]
fn read_as_vec<T>() -> Vec<T>
where
    T: FromStr,
    <T as FromStr>::Err: Debug,
{
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).unwrap();
    s.trim()
        .split_whitespace()
        .map(|c| T::from_str(c).unwrap())
        .collect()
}

#[allow(dead_code)]
fn read_as_string() -> String {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).unwrap();
    s.trim().to_string()
}

fn popcount(n: usize) -> usize {
    let mut n: usize = n;
    let mut ans = 0;
    while n > 0 {
        if n & 1 == 1 {
            ans += 1;
        }
        n >>= 1;
    }
    return ans;
}

fn f(x: usize) -> usize {
    let mut ans = 0;
    let mut x = x;
    while x != 0 {
        x = x % popcount(x);
        ans += 1;
    }
    return ans;
}

fn main() {
    let n: usize = read_as_vec()[0];
    let x: Vec<char> = read_as_string().chars().collect::<Vec<char>>();
    let nmax: usize = 200000;
    let mut fcache: Vec<usize> = vec![0; cmp::min(nmax, n) + 1];
    for i in 0..fcache.len() {
        fcache[i] = f(i);
    }

    let n1 = x.iter().filter(|x| **x == '1').count();
    // if n1 == 0 {
    //     for i in 0..n {
    //         println!("0");
    //     }
    //     return;
    // }

    let mut mod_n1_plus_1 = 0;
    let mut base = 1;
    for d in x.iter().rev() {
        if *d == '1' {
            mod_n1_plus_1 = (mod_n1_plus_1 + base) % (n1 + 1);
        }
        base = (base * 2) % (n1 + 1);
    }

    let mut mod_n1_minus_1 = 0;
    let mut base = 1;
    if n1 > 1 {
        for d in x.iter().rev() {
            if *d == '1' {
                mod_n1_minus_1 = (mod_n1_minus_1 + base) % (n1 - 1);
            }
            base = (base * 2) % (n1 - 1);
        }
    }

    let mut anses = vec![];
    let mut base_minus = 1;
    let mut base_plus = 1;
    for i in (0..n).rev() {
        //println!("calc = x{}", i);
        let y: usize;
        if x[i] == '1' {
            if n1 > 1 {
                y = (mod_n1_minus_1 + (n1 - 1) - base_minus) % (n1 - 1);
                anses.push(fcache[y] + 1);
            } else {
                anses.push(0);
            }
        } else {
            y = (mod_n1_plus_1 + base_plus) % (n1 + 1);
            anses.push(fcache[y] + 1);
        }

        if n1 > 1 {
            base_minus = (base_minus * 2) % (n1 - 1);
        }
        base_plus = (base_plus * 2) % (n1 + 1);
    }

    for i in (0..anses.len()).rev() {
        //println!("x{}", i);
        println!("{}", anses[i]);
    }
}