#include <bits/stdc++.h>
using namespace std;
enum color { BLACK, WHITE, GRAY };
const int maxN = 1000009;
int alive[maxN];
int negzt[maxN];
int N;
int Next(int x) {
  if (negzt[x] > N) return negzt[x];
  if (alive[negzt[x]]) return negzt[x];
  return negzt[x] = Next(negzt[x]);
}
signed main() {
  int i, j, k;
  cin >> N;
  string str;
  cin >> str;
  int a[N + 1];
  for (i = 0; i < str.length(); i++) {
    if (str[i] == '0')
      a[i + 1] = 0;
    else if (str[i] == '1')
      a[i + 1] = 1;
    else
      a[i + 1] = 2;
  }
  int negzt0[N + 1];
  int negzt1[N + 1];
  for (i = 1; i <= N; i++) {
    negzt0[i] = negzt1[i] = N + 1;
  }
  int p0 = 0;
  int p1 = 0;
  for (i = 1; i <= N; i++) {
    if (a[i] == 0) {
      for (j = p0 + 1; j <= i; j++) {
        negzt0[j] = i;
      }
      p0 = i;
    }
    if (a[i] == 1) {
      for (j = p1 + 1; j <= i; j++) {
        negzt1[j] = i;
      }
      p1 = i;
    }
  }
  int conval[N + 1];
  vector<int> positions[N + 1];
  for (i = 1; i <= N; i++) {
    if (a[i] == 1) {
      conval[i] = negzt0[i] - i;
    } else if (a[i] == 0) {
      conval[i] = negzt1[i] - i;
    } else {
      conval[i] = max(negzt0[i] - i, negzt1[i] - i);
    }
    positions[conval[i]].push_back(i);
  }
  for (i = 1; i <= N; i++) {
    alive[i] = 1;
    negzt[i] = i + 1;
  }
  for (i = 1; i <= N; i++) {
    int p = 1;
    int ans = 0;
    while (p <= N) {
      if (alive[p]) {
        ans++;
        p = Next(p + i - 1);
      } else {
        p = Next(p);
      }
    }
    printf("%d ", ans);
    for (int w : positions[i]) {
      alive[w] = 0;
    }
  }
  printf("\n");
  return 0;
}
