#include <bits/stdc++.h>
using namespace std;
long long N = 1000000007;
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long binpow(long long a, int n) {
  if (!n) return 1;
  if (n % 2) return binpow(a, n - 1) * a % N;
  long long bp = binpow(a, n / 2);
  return bp * bp % N;
}
vector<pair<long long, long long> > segtree;
long long segt(int v, long long a, int l, int r, int tl, int tr) {
  if (l > r) return N;
  if (l == tl && r == tr) {
    segtree[v].second += a;
    return segtree[v].first + segtree[v].second;
  }
  int tm = (tl + tr) / 2;
  segtree[2 * v + 1].second += segtree[v].second;
  segtree[2 * v + 2].second += segtree[v].second;
  long long lef = segt(2 * v + 1, a, l, min(r, tm), tl, tm);
  long long rig = segt(2 * v + 2, a, max(l, tm + 1), r, tm + 1, tr);
  segtree[v].first = min(segtree[2 * v + 1].first + segtree[2 * v + 1].second,
                         segtree[2 * v + 2].first + segtree[2 * v + 2].second);
  segtree[v].second = 0;
  return min(lef, rig);
}
void solve() {
  int n;
  cin >> n;
  string s;
  cin >> s;
  int i = 0;
  for (i = 0; i < s.size(); ++i) {
    if (s[i] != '?') break;
  }
  if (i == n) {
    for (int i = 1; i <= n; ++i) {
      cout << n / i << " ";
    }
    return;
  }
  vector<int> ans(n);
  set<pair<int, int> > ind;
  vector<int> forb(n, -2);
  int p = 0;
  for (int j = 0; j < n; ++j) {
    ans[j] += i / (j + 1);
    ind.insert(make_pair(max(j + 1 - i % (j + 1), 0), j));
  }
  int prev = 0;
  for (; i < n;) {
    int tr = 0, j = i + 1, o = i;
    do {
      while (j < n && s[j] == s[o]) ++j;
      tr += j - i;
      i = j;
      while (j < n && s[j] == '?') ++j;
    } while (j != n && s[j] == s[o]);
    int r = j - i;
    i = j;
    int val = tr + r;
    set<pair<int, int> > temp;
    for (auto it : ind) {
      int nv = val - it.first, m = it.second + 1;
      if (nv < 0) break;
      ans[it.second] += 1 + nv / m;
      forb[it.second] = p;
      temp.insert(make_pair(m - min(r, nv % m), it.second));
    }
    ind = temp;
    val += prev;
    for (int k = prev; k < n; ++k) {
      if (val < k + 1) break;
      if (forb[k] > p - 2) continue;
      ans[k] += val / (k + 1);
      forb[k] = p;
      ind.insert(make_pair(k + 1 - min(r, val % (k + 1)), k));
    }
    val -= prev;
    for (int k = 0; k < min(min(val, n), prev); ++k) {
      if (forb[k] > p - 1) continue;
      ans[k] += val / (k + 1);
      forb[k] = p;
      ind.insert(make_pair(k + 1 - min(r, val % (k + 1)), k));
    }
    prev = r;
    ++p;
  }
  for (int i = 0; i < ans.size(); ++i) {
    cout << ans[i] << " ";
  }
}
int main() {
  int tt = 1;
  while (tt--) {
    solve();
  }
  return 0;
}
