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 Java (OpenJDK 11.0.6) (judge verdict: Accepted)

import java.util.*;		
import java.util.function.Function;
import java.util.stream.Collectors;
import java.io.*;
import java.math.*;
public class Main{
	static public void main(String args[])throws IOException{
		int tt=1;
		int[] count=new int[200001];
		for(int i=0;i<200001;i++){
			int num=i;
			while(num>0){
				int tmp=Integer.bitCount(num);
				num=num%tmp;
				count[i]++;
			}
		}
		StringBuilder sb=new StringBuilder();
		for(int ttt=1;ttt<=tt;ttt++){
			int n=i();
			String s=s();
			int tmp=0;
			for(int i=0;i<n;i++){
				if(s.charAt(i)=='1'){
					tmp++;
				}
			}
			long[] normalpre=new long[n];
			long[] normalpost=new long[n];
			long[] pre=new long[n];
			long[] post=new long[n];
			for(int i=0;i<n;i++){
				if(i==0){
					if(s.charAt(i)=='1'){
						normalpre[i]=pow(2,n-1-i,tmp+1);
						if(tmp-1>0){
							pre[i]=pow(2,n-1-i,tmp-1);
						}
					}else{
						normalpre[i]=0;
						pre[i]=0;
					}
				}else{
					if(s.charAt(i)=='1'){
						normalpre[i]=(normalpre[i-1]+pow(2,n-1-i,tmp+1))%(tmp+1);
						if(tmp-1>0){
							pre[i]=(pre[i-1]+pow(2,n-1-i,tmp-1))%(tmp-1);
						}else{
							pre[i]=pre[i-1];
						}
					}else{
						normalpre[i]=normalpre[i-1];
						pre[i]=pre[i-1];
					}
				}
			}
			for(int i=n-1;i>=0;i--){
				if(i==n-1){
					if(s.charAt(i)=='1'){
						normalpost[i]=pow(2,n-1-i,tmp+1);
						if(tmp-1>0){
						post[i]=pow(2,n-1-i,tmp-1);
						}
					}else{
						normalpost[i]=0;
						post[i]=0;
					}
				}else{
					if(s.charAt(i)=='1'){
						normalpost[i]=(normalpost[i+1]+pow(2,n-1-i,tmp+1))%(tmp+1);
						if(tmp-1>0){
						post[i]=(post[i+1]+pow(2,n-1-i,tmp-1))%(tmp-1);
						}else{
							post[i]=post[i+1];
						}
					}else{
						normalpost[i]=normalpost[i+1];
						post[i]=post[i+1];
					}
				}
			}	
			char[] ch=s.toCharArray();
			for(int i=0;i<n;i++){
				int curr=tmp;
				if(ch[i]=='0'){
					ch[i]='1';
					curr++;
				}else{
					ch[i]='0';
					curr--;
				}
				if(curr==tmp+1){
					long ans=0;
					if(i-1>=0){
						ans=normalpre[i-1];
					}
					if(i+1<n){
						ans=ans+normalpost[i+1];
					}
					ans=ans+pow(2,n-1-i,tmp+1);
					ans=ans%(tmp+1);
					int fin=1+count[(int)ans];
					sb.append(fin+"\n");
				}else{
					long ans=0;
					if(i-1>=0){
						ans=pre[i-1];
					}
					if(i+1<n){
						ans=ans+post[i+1];
					}
					if(tmp-1>0){
					ans=ans%(tmp-1);
					}else{
						ans=0;
					}
					int fin=1+count[(int)ans];
					if(tmp-1<=0){
						sb.append("0\n");
					}else{
						sb.append(fin+"\n");
					}
				}
			}
		}
		System.out.print(sb.toString());
	}
	static InputReader in=new InputReader(System.in);
	static OutputWriter out=new OutputWriter(System.out);
	static ArrayList<ArrayList<Integer>> graph;
	static int mod=1000000007;
	static class Pair{
		int x;
		int y;
		Pair(int x,int y){
			this.x=x;
			this.y=y;
		}
	/*	@Override
		public int hashCode() 
		{ 
			final int temp = 14; 
			int ans = 1; 
			ans =x*31+y*13; 
			return (int)ans;
		}*/ 
   /*    @Override
        public boolean equals(Object o) 
        { 
            if (this == o) { 
                return true; 
            } 
            if (o == null) { 
                return false; 
            } 
            if (this.getClass() != o.getClass()) { 
                return false; 
            } 
            Pair other = (Pair)o; 
            if (this.x != other.x || this.y!=other.y) { 
                return false; 
            } 
            return true; 
        }*/
	}
	public static int[] sort(int[] a){
		int n=a.length;
		ArrayList<Integer> ar=new ArrayList<>();
		for(int i=0;i<a.length;i++){
			ar.add(a[i]);
		}
		Collections.sort(ar);
		for(int i=0;i<n;i++){
			a[i]=ar.get(i);
		}
		return a;
	}
	public static long pow(long a, long b,int mo){
        long result=1;
        while(b>0){
            if (b % 2 != 0){
                result=(result*a)%mo;
                b--;
            } 
            a=(a*a)%mo;
            b /= 2;
        }   
        return result;
    }
	public static long gcd(long a, long b){
        if (a == 0){
            return b;
		}
        return gcd(b%a, a);
    }
	public static long lcm(long a, long b){
		return a*(b/gcd(a,b));
	}
	public static long l(){
		String s=in.String();
		return Long.parseLong(s);
	}
	public static void pln(String value){
		System.out.println(value);
	}
	public static int i(){
		return in.Int();
	}
	public static String s(){
		return in.String();
	}
} 
class InputReader 
{
	private InputStream stream;
	private byte[] buf = new byte[1024];
	private int curChar;
	private int numChars;
	private SpaceCharFilter filter;
	public InputReader(InputStream stream) {
		this.stream = stream;
	}
	public int read() {
		if (numChars== -1)
			throw new InputMismatchException();
		if (curChar >= numChars) {
			curChar = 0;
			try {
				numChars = stream.read(buf);
			} catch (IOException e) {
				throw new InputMismatchException();
			}
			if (numChars <= 0)
				return -1;
		}
		return buf[curChar++];
	}
	public int Int() {
		int c = read();
		while (isSpaceChar(c))
			c = read();
		int sgn = 1;
		if (c == '-') {
			sgn = -1;
			c = read();
		}
		int res = 0;
		do {
			if (c < '0' || c > '9')
				throw new InputMismatchException();
			res *= 10;
			res += c - '0';
			c = read();
		} while (!isSpaceChar(c));
		return res * sgn;
	}
	public String String() {
		int c = read();
		while (isSpaceChar(c))
			c = read();
		StringBuilder res = new StringBuilder();
		do {
			res.appendCodePoint(c);
			c = read();
		} while (!isSpaceChar(c));
		return res.toString();
	} 
	public boolean isSpaceChar(int c) {
		if (filter != null)
			return filter.isSpaceChar(c);
		return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
	} 
	public String next() {
		return String();
	} 
	public interface SpaceCharFilter {
		public boolean isSpaceChar(int ch);
	}
}
class OutputWriter {
	private final PrintWriter writer;
	public OutputWriter(OutputStream outputStream) {
		writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream)));
	}
	public OutputWriter(Writer writer) {
		this.writer = new PrintWriter(writer);
	}
	public void print(Object...objects) {
		for (int i = 0; i < objects.length; i++) {
			if (i != 0)
				writer.print(' ');
			writer.print(objects[i]);
		}
	}
	public void printLine(Object...objects) {
		print(objects);
		writer.println();
	}
	public void close() {
		writer.close();
	}
	public void flush() {
		writer.flush();
	}
 }
class IOUtils {
	public static int[] readIntArray(InputReader in, int size) {
		int[] array = new int[size];
		for (int i = 0; i < size; i++)
			array[i] = in.Int();
		return array;
	}
}