#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
const vector<int> mods = {998244353, 1000000007, 1000000009};
const long long inf = 3e18;
const double pi = acos(-1.0);
const double eps = 0.0000001;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
template <class... K>
using umap = unordered_map<K...>;
template <class... K>
using uset = unordered_set<K...>;
long long n, res, nx[1000100], lnx[1000100];
string s;
int main() {
  cin.sync_with_stdio(0);
  cin.tie(0);
  cout.precision(13);
  cin >> n >> s;
  long long cur = 0, ex = 0, ty = 2;
  for (long long i = (0); i < (n); ++i) {
    if (s[i] == '?')
      ex++;
    else {
      long long nt = s[i] - '0';
      if (nt == ty)
        cur = (cur + ex + 1);
      else {
        for (long long j = (i - ex - cur); j < (i); ++j) nx[j] = i;
        for (long long j = (i - ex - cur); j < (i - ex); ++j) lnx[j] = i - ex;
        cur = (ex + 1);
      }
      ex = 0;
      ty = nt;
    }
  }
  for (long long j = (n - ex - cur); j < (n); ++j) nx[j] = n;
  for (long long j = (n - ex - cur); j < (n - ex); ++j) lnx[j] = n - ex;
  for (long long j = (n - ex); j < (n); ++j) lnx[j] = n;
  for (long long b = (1); b < (n + 1); ++b) {
    res = 0;
    long long pos = 0, prv = -1;
    while (pos < n) {
      long long mv = nx[pos] - pos;
      long long jp = mv / b;
      res += jp;
      if (jp) {
        pos += jp * b;
        prv = -1;
      } else {
        pos += lnx[pos] - pos;
        if (prv != -1)
          lnx[prv] = pos;
        else
          prv = pos;
      }
    }
    cout << res << " \n"[b == n];
  }
  return 0;
}
