#include <bits/stdc++.h>
using namespace std;
const unsigned seed =
    std::chrono::system_clock::now().time_since_epoch().count();
mt19937 rnd(seed);
const int MOD = 998244353;
void solve() {
  int n;
  cin >> n;
  string s;
  cin >> s;
  vector<pair<int, int>> cnt(n);
  int t[2] = {0, 0};
  for (int i = n - 1; i >= 0; i--) {
    int r[2];
    for (int j = 0; j < 2; j++) {
      if (s[i] == '?' || s[i] == '0' + j) {
        r[j] = t[j] + 1;
      } else
        r[j] = 0;
    }
    cnt[i] = {max(r[0], r[1]), i};
    t[0] = r[0];
    t[1] = r[1];
  }
  sort(cnt.begin(), cnt.end());
  vector<int> ss(n + 1);
  for (int i = 0; i <= n; i++) ss[i] = i;
  function<int(int)> find = [&](int p) {
    if (ss[p] == p)
      return p;
    else
      ss[p] = find(ss[p]);
    return ss[p];
  };
  int p = 0;
  for (int i = 1; i <= n; i++) {
    while (p < n && cnt[p].first < i) {
      int q = cnt[p].second;
      if (ss[q] == q) ss[q] = q + 1;
      p++;
    }
    int ans = 0;
    int q = 0;
    while (q < n) {
      int r = find(q);
      if (r == n) break;
      ans++;
      q = r + i;
    }
    cout << ans << " ";
  }
  cout << "\n";
}
int main() {
  std::ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.precision(10);
  int T = 1;
  for (int i = 1; i <= T; i++) {
    solve();
  }
  cout.flush();
  return 0;
}
