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: Wrong Answer)

#[allow(unused_imports)]
use std::collections::*;
#[allow(unused_imports)]
use std::iter::FromIterator;

fn main() {
    let mut reader = acio::Reader::from_stdin();
    let n: usize = reader.read();
    let x: String = reader.read();
    let b = x
        .as_bytes()
        .iter()
        .rev()
        .enumerate()
        .fold(0, |acc, (i, &x)| if 0x30 < x { acc | 1 << i } else { acc });
    for i in (0..n).into_iter().rev() {
        let mut p = (b ^ 1 << i) as u32;
        let mut c = 0;
        while p != 0 {
            p %= p.count_ones();
            c += 1;
        }
        println!("{}", c);
    }
}

//-- MODULES --

/// Mathematics Module
#[allow(dead_code)]
mod math {
    use std::mem::swap;

    /// Methods for Each Integer Type
    pub trait Integer {}
    /// Implements trait Integer
    macro_rules! integer {
        ($t:ty) => {
            impl Integer for $t {}
        };
    }

    /// Methods for Each Natural Integer Type
    pub trait Natural {
        fn lcm(v1: Self, v2: Self) -> Self;
        fn gcd(v1: Self, v2: Self) -> Self;
        fn fact(n: Self) -> Self;
        fn perm(n: Self, k: Self) -> Self;
        fn comb(n: Self, k: Self) -> Self;
    }
    /// Implements trait Natural
    macro_rules! natural {
        ($t:ty) => {
            impl Natural for $t {
                fn lcm(v1: $t, v2: $t) -> $t {
                    v1 * v2 / Self::gcd(v1, v2)
                }

                fn gcd(v1: $t, v2: $t) -> $t {
                    let (mut v1, mut v2) = (v1, v2);
                    if v1 < v2 {
                        swap(&mut v1, &mut v2);
                    }
                    while v2 != 0 {
                        let t = v1;
                        v1 = v2;
                        v2 = t % v2;
                    }
                    return v1;
                }

                fn fact(n: $t) -> $t {
                    let mut a = 1;
                    for i in 1..=n {
                        a *= i;
                    }
                    return a;
                }

                fn perm(n: $t, k: $t) -> $t {
                    Self::fact(n) / Self::fact(n - k)
                }

                fn comb(n: $t, k: $t) -> $t {
                    Self::perm(n, k) / Self::fact(k)
                }
            }
        };
    }

    // BEGIN DECLARATIONS
    integer!(i8);
    integer!(i16);
    integer!(i32);
    integer!(i64);
    integer!(isize);
    integer!(u8);
    integer!(u16);
    integer!(u32);
    integer!(u64);
    integer!(usize);
    // ---
    natural!(u8);
    natural!(u16);
    natural!(u32);
    natural!(u64);
    natural!(usize);
    // END DECLARATIONS
}

/// IO Module for AtCoder
#[allow(dead_code)]
mod acio {
    use std::fmt::Debug;
    use std::io::{stdin, BufRead, BufReader, Read, Stdin};
    use std::str::FromStr;

    /// Multi-Purpose Value Reader
    pub struct Reader<R>
    where
        R: Read,
    {
        input: BufReader<R>,
        stack: Vec<String>,
    }

    impl<R: Read> Reader<R> {
        /// Create Reader from Read
        pub fn new<T>(input: R) -> Self {
            // Self { // <- Warning: NOT YET on AtCoder
            Reader {
                input: BufReader::new(input),
                stack: vec![],
            }
        }

        /// Read Multiple Value
        pub fn read_by<F>(&mut self, count: usize) -> Vec<F>
        where
            F: FromStr,
            <F as FromStr>::Err: Debug,
        {
            (0..count).map(|_| self.read()).collect()
        }

        /// Read Single Value
        pub fn read<F>(&mut self) -> F
        where
            F: FromStr,
            <F as FromStr>::Err: Debug,
        {
            while self.stack.is_empty() {
                let mut line = self.read_line();
                self.stack.append(&mut line);
                self.stack.reverse();
            }
            self.stack.pop().unwrap().parse().unwrap()
        }

        /// Read Space Split Line
        fn read_line(&mut self) -> Vec<String> {
            let mut buf = String::new();
            self.input.read_line(&mut buf).unwrap();
            buf.split_whitespace().map(|s| s.to_string()).collect()
        }
    }

    impl Reader<Stdin> {
        /// Create Reader from stdin
        pub fn from_stdin() -> Self {
            Self::new::<Reader<Stdin>>(stdin())
        }
    }

    /*
    impl<T> Drop for Reader<T> {
        /// FOR DEBUG
        fn drop(&mut self) {
            if self.stack.len() != 0 {
                panic!("Reader with remaining value is dropped.")
            }
        }
    }
    */
}