#include <bits/stdc++.h>
using namespace std;
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << endl;
  err(++it, args...);
}
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const int fx[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
const int fxx[8][2] = {{0, 1}, {0, -1}, {1, 0},  {-1, 0},
                       {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
const int N = 1000010;
int n;
char s[N];
vector<int> p[2][N];
int cxt[2][N];
int main() {
  scanf("%d", &n);
  scanf("%s", s);
  for (int i = n - 1; i >= 0; i--) {
    if (s[i] != '0') cxt[0][i] = cxt[0][i + 1] + 1;
    if (s[i] != '1') cxt[1][i] = cxt[1][i + 1] + 1;
  }
  for (int i = int(0); i < int(2); i++) {
    int l = 0;
    while (l < n) {
      if (s[l] == char(i + '0')) {
        ++l;
        continue;
      }
      int r = l + 1;
      while (r < n && s[r] != char('0' + i)) ++r;
      for (int len = 1; len <= r - l; len++) {
        p[i][len].push_back(l);
      }
      l = r;
    }
  }
  printf("%d ", n);
  for (int i = int(2); i < int(n + 1); i++) {
    int pos = 0, ans = 0;
    int p0 = 0, p1 = 0;
    while (pos < n) {
      int npos = inf;
      if (cxt[0][pos] >= i) npos = pos + i;
      if (cxt[1][pos] >= i) npos = pos + i;
      while (p0 < ((int)((p[0][i]).size())) && pos > p[0][i][p0]) ++p0;
      if (p0 < ((int)((p[0][i]).size()))) npos = min(npos, p[0][i][p0] + i);
      while (p1 < ((int)((p[1][i]).size())) && pos > p[1][i][p1]) ++p1;
      if (p1 < ((int)((p[1][i]).size()))) npos = min(npos, p[1][i][p1] + i);
      if (npos != inf) ++ans;
      pos = npos;
    }
    printf("%d ", ans);
  }
  printf("\n");
  return 0;
}
