#include <bits/stdc++.h>
using namespace std;
int p[1000010];
int find(int x) { return p[x] < 0 ? x : p[x] = find(p[x]); }
void merge(int x, int y) {
  if ((x = find(x)) == (y = find(y))) return;
  if (x > y) swap(x, y);
  p[x] = y;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  string s;
  cin >> n >> s;
  vector<vector<int>> prefix(3, vector<int>(n + 1, 0));
  vector<int> idx(256);
  idx['0'] = 0;
  idx['1'] = 1;
  idx['?'] = 2;
  for (int i = 1; i <= n; ++i) {
    for (int j = 0; j < 3; ++j) {
      prefix[j][i] = prefix[j][i - 1];
    }
    int id = idx[s[i - 1]];
    ++prefix[id][i];
  }
  vector<pair<int, int>> arr(n);
  int j = 1;
  for (int i = 1; i <= n; ++i) {
    while (j <= i) {
      int cnt0 = prefix[idx['0']][i] - prefix[idx['0']][j - 1];
      int cnt1 = prefix[idx['1']][i] - prefix[idx['1']][j - 1];
      int cntQ = prefix[idx['?']][i] - prefix[idx['?']][j - 1];
      if (cnt0 + cntQ == i - j + 1) {
        break;
      }
      if (cnt1 + cntQ == i - j + 1) {
        break;
      }
      ++j;
    }
    assert(j <= i);
    arr[i - 1] = {i - j + 1, i};
  }
  sort(arr.begin(), arr.end());
  fill(p, p + n + 3, -1);
  int pos = 0;
  for (int len = 1; len <= n; ++len) {
    while (pos < arr.size() && arr[pos].first < len) {
      merge(arr[pos].second, arr[pos].second + 1);
      ++pos;
    }
    int res = 0;
    int idx = 0;
    while (true) {
      if (idx + len > n) break;
      idx = find(idx + len);
      if (idx > n) break;
      ++res;
      if (idx == n) break;
    }
    cout << res << " ";
  }
}
