#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 5;
int pref[MAXN][5];
int par[MAXN];
int mx[MAXN];
int n;
int find(int curr, int len) {
  if (par[curr] > n || mx[par[curr]] >= len) {
    return par[curr];
  }
  return par[curr] = find(par[curr], len);
}
bool check(int ind, int len) {
  if (ind + len - 1 > n) {
    return false;
  }
  if (pref[ind + len - 1][0] - pref[ind - 1][0] > 0 &&
      pref[ind + len - 1][1] - pref[ind - 1][1] > 0) {
    return false;
  }
  if (ind == 3 && len == 4) {
  }
  return true;
}
int calc(int x) {
  int curr = 1;
  int ans = 0;
  while (curr + x - 1 <= n) {
    if (!check(curr, x)) {
      curr = par[curr];
    } else {
      ans++;
      curr += x;
    }
  }
  return ans;
}
int main() {
  cin >> n;
  string s;
  cin >> s;
  s = '#' + s;
  for (int i = 1; i <= n; i++) {
    pref[i][0] = pref[i - 1][0];
    pref[i][1] = pref[i - 1][1];
    if (s[i] == '0') {
      pref[i][0]++;
    } else if (s[i] == '1') {
      pref[i][1]++;
    }
  }
  for (int i = 1; i <= n; i++) {
    int l = 1;
    int r = n - i + 1;
    while (l <= r) {
      int mid = (l + r) / 2;
      if (check(i, mid)) {
        l = mid + 1;
        mx[i] = mid;
      } else {
        r = mid - 1;
      }
    }
  }
  stack<int> st;
  for (int i = n; i >= 1; i--) {
    while (st.size() && mx[st.top()] <= mx[i]) {
      st.pop();
    }
    if (st.size()) {
      par[i] = st.top();
    } else {
      par[i] = n + 1;
    }
    st.push(i);
  }
  for (int i = 1; i <= n; i++) {
    cout << calc(i) << " ";
  }
}
