#include <bits/stdc++.h>
using namespace std;
void conv(string& s) {
  long long n = s.length();
  long long one[n];
  long long zero[n];
  long long oo = n;
  long long zz = n;
  for (long long i = n - 1; i >= 0; i--) {
    one[i] = oo;
    zero[i] = zz;
    if (s[i] == '0')
      zz = i;
    else if (s[i] == '1')
      oo = i;
  }
  for (long long i = 0; i < n - 1; i++) {
    if (s[i] == '1' && one[i] <= zero[i])
      s[i + 1] = '1';
    else if (s[i] == '0' && zero[i] <= one[i])
      s[i + 1] = '0';
  }
  char first = '?';
  for (auto x : s)
    if (x != '?') {
      first = x;
      break;
    }
  for (auto& x : s)
    if (x == '?')
      x = first;
    else
      break;
}
void solve() {
  long long n;
  cin >> n;
  string s;
  cin >> s;
  long long fa = 0, fb = 0;
  for (auto x : s)
    if (x == '0')
      fa = 1;
    else if (x == '1')
      fb = 1;
  if (fa == 0 || fb == 0) {
    for (long long i = 1; i <= n; i++) cout << (n / i) << ' ';
    return;
  }
  conv(s);
  vector<pair<char, pair<long long, long long> > > go;
  char last = '8';
  long long cnt = 0;
  for (long long i = 0; i < n; i++) {
    auto x = s[i];
    if (x != last && cnt > 0) go.push_back({last, {cnt, i - cnt}});
    if (x != last) cnt = 0;
    last = x;
    cnt++;
  }
  go.push_back({last, {cnt, n - cnt}});
  vector<pair<pair<long long, long long>, pair<long long, long long> > > cur;
  for (long long i = 0; i < go.size(); i++) {
    if (go[i].first == '?') continue;
    cur.push_back({go[i].second, {0, 0}});
    if (i > 0 && go[i - 1].first == '?')
      cur.back().second.first = go[i - 1].second.first;
    if (i != (long long)go.size() - 1 && go[i + 1].first == '?')
      cur.back().second.second = go[i + 1].second.first;
  }
  for (long long l = 1; l <= n; l++) {
    long long res = 0;
    long long carry = 0;
    for (long long i = 0; i < cur.size(); i++) {
      auto x = cur[i];
      long long tot = x.first.first + x.second.first + x.second.second;
      if (i > 0 && cur[i - 1].first.second + cur[i - 1].second.second +
                           cur[i - 1].first.first ==
                       cur[i].first.second)
        tot += carry;
      res += (tot / l);
      long long nouse = (tot % l);
      if (nouse > x.second.second)
        carry = 0;
      else
        carry = nouse - x.second.second;
    }
    cout << res << ' ';
    vector<pair<pair<long long, long long>, pair<long long, long long> > > nex;
    for (long long i = 0; i < cur.size(); i++) {
      auto x = cur[i];
      long long potential = x.first.first + x.second.first + x.second.second;
      if (potential > l) nex.push_back(x);
    }
    swap(nex, cur);
  }
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long t = 1;
  while (t--) solve();
}
