#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimization("unroll-loops, no-stack-protector")
#pragma GCC target("avx,avx2,fma")
using namespace std;
const int INF = int(1e9) + 99;
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  cout.tie(0);
  int n;
  string s;
  cin >> n >> s;
  vector<int> max_0(n + 1, 0);
  vector<int> max_1(n + 1, 0);
  for (int i = n - 1; i >= 0; --i) {
    if (s[i] != '0') max_1[i] = 1 + max_1[i + 1];
    if (s[i] != '1') max_0[i] = 1 + max_0[i + 1];
  }
  unordered_map<int, vector<int>> pos_0;
  unordered_map<int, vector<int>> pos_1;
  int c = 0;
  while (c < n) {
    if (c == 0 || s[c - 1] == '1') {
      for (int len = 1; len <= max_0[c]; ++len) {
        pos_0[len].push_back(c);
      }
      c += max(max_0[c], 1);
    } else {
      ++c;
    }
  }
  c = 0;
  while (c < n) {
    if (c == 0 || s[c - 1] == '0') {
      for (int len = 1; len <= max_1[c]; ++len) {
        pos_1[len].push_back(c);
      }
      c += max(max_1[c], 1);
    } else {
      ++c;
    }
  }
  for (int len = 1; len <= n; ++len) {
    int pos = 0;
    int ans = 0;
    int index_0 = 0;
    int index_1 = 0;
    while (pos < n) {
      int npos = INF;
      if (max_0[pos] >= len) {
        npos = min(npos, pos + len);
      }
      if (max_1[pos] >= len) {
        npos = min(npos, pos + len);
      }
      while ((index_0 < (int)pos_0[len].size()) && (pos > pos_0[len][index_0]))
        ++index_0;
      while ((index_1 < (int)pos_1[len].size()) && (pos > pos_1[len][index_1]))
        ++index_1;
      if (index_0 < (int)pos_0[len].size()) {
        npos = min(npos, pos_0[len][index_0] + len);
      }
      if (index_1 < (int)pos_1[len].size()) {
        npos = min(npos, pos_1[len][index_1] + len);
      }
      if (npos != INF) {
        ++ans;
      }
      pos = npos;
    }
    cout << ans << ' ';
  }
  cout << endl;
}
