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: Runtime Error)

//D - Anything Goes to Zero
//Hiia
#include <stdio.h>
#include <stdlib.h>//rannsuu, zettaichi(absolute)
#include <time.h>
//srand((unsigned int) time(0));
#include <math.h>//koudona keisann
#include <string.h>//hairetsu
#define max(p,q)((p)>(q)?(p):(q))
#define min(p,q)((p)<(q)?(p):(q))
typedef long long ll;
//#define N 998244353
#define pi 3.1415926535897932384626433832

int gcd(int m,int n){if((0==m)||(0==n))return 0;while(m!=n)if(m>n)m=m-n;else n=n-m;return m;}
int lcm(int m,int n){if((0==m)||(0==n))return 0;return(m*n/gcd(m, n));}
int fact(int x){if(x==1) return(x);else return(x*fact(x-1));}//Kaijou x!
int ruijou(int base,int exponent){int i,answer=1;i=exponent;while(i!=0){answer=answer*base;--i;}return answer;}//ruijou base^exponent

long long int llgcd(long long int m,long long int n){if((0==m)||(0==n))return 0;while(m!=n)if(m>n)m=m-n;else n=n-m;return m;}
long long int lllcm(long long int m,long long int n){if((0==m)||(0==n))return 0;return(m*n/llgcd(m, n));}
long long int llfact(long long int x){if(x==1) return(x);else return(x*llfact(x-1));}//Kaijou
int llruijou(long long int base,long long int exponent){long long int i,answer=1;i=exponent;while(i!=0){answer=answer*base;--i;}return answer;}//ruijou base^exponent


int popcount(long long int decimal){
  long long int i,j=0,n1=0;
  long long int binary[32]={0},a[32]={0};
  long long int x=decimal;
  for(i=0;decimal>0;i++){
    binary[i] = decimal % 2;
    decimal = decimal / 2;
    //printf("%lld", binary[i]);
  }
  //printf("binary\n");
  while( i>0 ){
    a[j]=binary[i-1];
    //printf("%lld", a[j]);
    i--;
    if(a[j]==1){
      n1++;
    }
    j++;
  }

  //printf("\n1 no kazu %lld\n", n1);
  if(n1<=0){
    return (0);
  }
  else{
    return (x%n1);
  }
}


int main()
{
  long long int n,x[10010]={0},x10,a[10010]={0},i;
  scanf("%lld", &n);
  scanf("%lld", &x10);

  for(long long int i = 1; i <= n; i++) {
    x[n-i+1] = x10 % 10;
    x10 = x10 / 10;
  }

  for(long long int k = 1; k <= n; k++) {
      for(long long int j = 1; j <= n; j++) {

        if(j==k){
          a[j]=(x[j]+1)%2;
        }
        else{
          a[j]=x[j];
        }
      }
/*
      for(i=1;i<=n;i++){ //gggggggggggggg
        printf("%lld", a[i]);
      }
      printf("t\n");
*/
      long long int a10=0,kake=1;
      for(i=1;i<=n;i++){
        a10+=a[n-i+1]*kake;
        kake*=2;
      }
      //printf("a10 = %lld\n", a10);

      long long int count=0;


      while(1){
        if(a10==0){
          break;
        }
        a10=popcount(a10);
        count++;
        //printf("%lld:%lld\n", count,a10);
      }

      printf("%lld\n", count);
      //printf("\n");

  }
  return 0;
}