#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;
using namespace std;


#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define PSET(x,y) fixed<<setprecision(y)<<x
#define pb push_back
#define pii pair<int,int>
#define pf push_front
#define mp make_pair
#define vi vector<int>
#define vip vector<pair<int,int> >
#define ff first
#define ss second
#define int long long
//#define mod 1000000007
#define BIG 998244353
#define s(t) scanf("%lld",&t)
#define p(t) printf("%lld\n",t)
#define mii map<int,int>
#define MSET(table,i) memset(table, i, sizeof(table))
#define endl '\n'
#define tc int t;cin>>t;while(t--)
#define pi  3.1415926358
#define bits(x) __builtin_popcount(x)
#define minimum(a,n) min_element(a,a+n)-a
#define maximum(a,n) max_element(a,a+n)-a
#define pqbig priority_queue<int>
#define pqsmall priority_queue<pii,vector<pii>,greater<pii> >
#define all(v) v.begin(),v.end()
#define sitr set<int>:: iterator
#define spitr set<pii>:: iterator
#define mitr map<int,int>:: iterator

int toint(const string &s) {stringstream ss; ss << s; int x; ss >> x; return x;}
string tostring ( int number ) {stringstream ss; ss << number; return ss.str();}


typedef tree<pair<pii, pair<int, pii> >, null_type, less<pair<pii, pair<int, pii> > >, rb_tree_tag,
        tree_order_statistics_node_update>
        new_data_set;


#define trace1(x)                cerr<<#x<<": "<<x<<endl
#define trace2(x, y)             cerr<<#x<<": "<<x<<" | "<<#y<<": "<<y<<endl
#define trace3(x, y, z)          cerr<<#x<<":" <<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl
#define trace4(a, b, c, d)       cerr<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl
#define trace5(a, b, c, d, e)    cerr<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<< ": "<<e<<endl
#define trace6(a, b, c, d, e, f) cerr<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<< ": "<<e<<" | "<<#f<<": "<<f<<endl

int power(int n, int p, int mod)
{
	if (p == 0)
		return 1;
	int x = power(n, p / 2, mod);
	x *= x, x %= mod;
	if (p & 1)
		x *= n, x %= mod;
	return x;
}

int solve(string &s, int mod)
{
	if (mod == 0)
		return -1;
	if (mod == 1)
		return 0;

	int ans = 0;
	for (int i = 0; i < s.size(); i++)
	{
		if(s[i]=='0')
			continue;
		int id = s.size() - 1 - i;
		ans += power(2, id, mod);
		ans %= mod;
		//trace2(ans,mod);
	}
	return ans;
}

int32_t main()
{
	fast;
	int n; cin >> n;
	string s; cin >> s;
	int cnt = count(all(s), '1');

	int rem_pos = solve(s, cnt + 1);
	int rem_neg = solve(s, cnt - 1);

	//trace2(rem_pos,rem_neg);

	for (int i = 0; i < n; i++)
	{
		if (s[i] == '1')
		{
			if (cnt == 1)
				cout << 0 << endl;
			else
			{
				int start = rem_neg-power(2,n-1-i,cnt-1);
				start+=(cnt-1),start%=(cnt-1);
				//trace1(start);
				int ans = 1;
				while (start)
				{
					ans++;
					start %= bits(start);
				}
				cout << ans << endl;
			}
		}
		else
		{
			int start = rem_pos+power(2,n-1-i,cnt+1);
			start%=(cnt+1);
			//trace1(start);
			int ans = 1;
			while (start)
			{
				ans++;
				start %= bits(start);
			}
			cout << ans << endl;
		}
	}
}

Measured memory_bytes: 3748