#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int nt[N][2], a[N], w[N], one[N];
vector<int> qr[N];
int findSet(int x) { return w[x] < 0 ? x : w[x] = findSet(w[x]); }
void un(int x, int y) {
  x = findSet(x);
  y = findSet(y);
  if (x == y) return;
  if (w[x] > w[y]) swap(x, y);
  w[x] += w[y];
  w[y] = x;
  one[x] = max(one[x], one[y]);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  string s;
  int n;
  cin >> n >> s;
  for (int i = 0; i <= n; i++) {
    w[i] = -1;
    one[i] = i;
  }
  nt[n - 1][0] = n;
  nt[n - 1][1] = n;
  for (int i = n - 2; i >= 0; i--) {
    for (int j = 0; j < 2; j++) {
      if (s[i + 1] == '0' + j) {
        nt[i][j] = i + 1;
      } else {
        nt[i][j] = nt[i + 1][j];
      }
    }
  }
  for (int i = 0; i < n; i++) {
    int x;
    if (s[i] == '?') {
      x = max(nt[i][0], nt[i][1]) - i;
    } else {
      x = nt[i][1 - int(s[i] - '0')] - i;
    }
    qr[x].push_back(i);
  }
  for (int i = 1; i <= n; i++) {
    int ans = 0, j = one[findSet(0)];
    while (j < n) {
      ans++;
      j = one[findSet(j + i)];
    }
    cout << ans << " ";
    for (const int &x : qr[i]) {
      un(x, x + 1);
      one[findSet(x)] = one[findSet(x + 1)];
    }
  }
  return 0;
}
