#include <bits/stdc++.h>
using namespace std;
string s;
int last_id[2] = {0};
int largest_set_till[1123456];
vector<int> set_ids[1123456];
int bit[1123456];
inline void update(int x, int v) {
  assert(x != 0);
  while (x < 1123456) {
    bit[x] += v;
    x += (x & -x);
  }
}
inline int query(int x) {
  while (x > 0) {
    if (bit[x] > 0) {
      break;
    }
    x -= (x & -x);
  }
  if (x == 0) return 0;
  int last_bit = (x & -x);
  int cnt = bit[x];
  x -= last_bit;
  last_bit >>= 1;
  int tmp_cnt = 0;
  while (last_bit > 0) {
    if (tmp_cnt + bit[x + last_bit] < cnt) {
      tmp_cnt += bit[x + last_bit];
      x += last_bit;
    }
    last_bit >>= 1;
  }
  return x + 1;
}
inline void solve() {
  int n;
  cin >> n >> s;
  for (long long int i = 0; i < n; ++i) {
    if (s[i] == '?') {
      largest_set_till[i + 1] = i + 1 - min(last_id[0], last_id[1]);
    } else {
      largest_set_till[i + 1] = i + 1 - last_id[1 - (s[i] - '0')];
      last_id[s[i] - '0'] = i + 1;
    }
    set_ids[largest_set_till[i + 1]].push_back(i + 1);
    update(i + 1, 1);
  }
  for (long long int k = 1; k < n + 1; ++k) {
    int r = n;
    int ans = 0;
    while (r >= k) {
      r = query(r);
      if (r >= k) {
        ans++;
      }
      r -= k;
    }
    for (long long int j = 0; j < set_ids[k].size(); ++j) {
      update(set_ids[k][j], -1);
    }
    cout << ans << (k < n ? " " : "\n");
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  int t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
