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 C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <iterator>
#include <cmath>
#include <set>
#include <deque> 
#include <string>


using namespace std;

int f[200010];
int n;

char x[200010];
int posCountL;
int posCount;	//原始数据 
int posCountH;
int remL[200010];	//对 -1的数据 
int remM[200010];	//对 原始数据 
int remH[200010];	//对 +1的数据 
int curRemL;
int curRemH;


int doRevert(int pos) {
	if (x[pos] == '0') {
		x[pos] = '1';
		return 1;
	} else {
		x[pos] = '0';
		return -1;
	}
}

int getF(int num) {
	if (f[num] != -1)
		return f[num];
	
	int count = 0;
	int theNum = num;
	while (theNum > 0) {
		int r = theNum % 2;
		count = count + r;
		theNum = theNum / 2;
	}
	
	int target = num % count;
	f[num] = getF(target) + 1;
	return f[num];
}

int main()
{
	for (int i = 0 ; i < 200010 ; i++)
		f[i] = -1;
	f[0] = 0;
	f[1] = 1;
	
	scanf("%d\n", &n);
	scanf("%s\n", x);
	
	if ((n == 1) && (x[0] == '1')) {
		printf("1\n");
		return 0;
	}
	
	posCount = 0;
	for (int i = 0 ; i < n ; i++) {
		if (x[i] == '1')
			posCount++;
	}
	posCountL = posCount - 1;
	posCountH = posCount + 1;
	remL[0] = 1;
	remM[0] = 1;
	remH[0] = 1;
	for (int i = 1 ; i <= n ; i++) {
		if (posCountL > 0) {
			remL[i] = (remL[i - 1] * 2) % posCountL;			
		}
		if (posCount > 0) {
			remM[i] = (remM[i - 1] * 2) % posCount;
		}

		remH[i] = (remH[i - 1] * 2) % posCountH;
	}

	curRemL = 0;
	curRemH = 0;
	for (int i = 0 ; i < n ; i++) {
		curRemL = curRemL * 2;
		curRemH = curRemH * 2;
		if (x[i] == '1') {
			curRemL++;
			curRemH++;
		}
		
		if (posCountL > 0) {
			curRemL = curRemL % posCountL;
		}
		
		curRemH = curRemH % posCountH;
	}


	
	int realBase;
	int realRem;
	int ans;
	for (int i = 0 ; i < n ; i++) {
		realBase = n - i - 1;
		int diff = doRevert(i);
		if (diff == -1) {
			if (posCountL == 0) {
				ans = 0;
			} else {
				//L侧 
				realRem = curRemL + posCountL - remL[realBase];
				realRem = realRem % posCountL;
				ans = getF(realRem) + 1;
			}
		} else {	//1
			realRem = curRemH + remH[realBase];
			realRem = realRem % posCountH;
			ans = getF(realRem) + 1;
		}
		
		printf("%d\n", ans);
		
		doRevert(i);
	}
	
	
	return 0;
}