#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("sse4")
using namespace std;
constexpr int INF = 1e9 + 9;
using Segment = array<long long, 4>;
void solve(int test, istream& in, ostream& out) {
  int n;
  in >> n;
  string s;
  in >> s;
  int first = -1, last = -1;
  for (int i = 0; i < n; ++i) {
    if (s[i] == '?') {
      int j = i;
      while (j < n && s[j] == '?') j++;
      if (i == 0 && j >= n) {
      } else if (i == 0) {
        for (int k = i; k < j; ++k) s[k] = s[j];
      } else if (j >= n) {
        for (int k = i; k < j; ++k) s[k] = s[i - 1];
      } else if (s[i - 1] == s[j]) {
        for (int k = i; k < j; ++k) s[k] = s[i - 1];
      }
      i = j - 1;
    }
  }
  if (first > -1)
    for (int i = 0; i < first; ++i) s[i] = s[first];
  if (last > -1)
    for (int i = last; i < n; ++i) s[i] = s[last];
  vector<Segment> segs;
  int idx = 0;
  while (idx < n) {
    int j = idx;
    while (j < n && s[j] == '?') j++;
    int left = j;
    while (j < n && s[j] == s[left]) j++;
    int right = j;
    while (j < n && s[j] == '?') j++;
    segs.push_back({idx, left - idx, right - left, j - right});
    idx = right;
  }
  for (auto& cur : segs) {
    auto& [idx, left, mid, right] = cur;
  }
  vector<Segment> next;
  int used = 0, usedIdx = -1;
  for (int x = 1; x <= n; ++x) {
    next.clear();
    long long cnt = 0;
    for (auto& seg : segs) {
      auto& [idx, left, mid, right] = seg;
      long long total = left + mid + right;
      if (total > x) {
        next.emplace_back(seg);
      }
      if (usedIdx == idx) total -= used;
      cnt += total / x;
      long long rem = min(right, total % x);
      used = right - rem;
      usedIdx = idx + left + mid;
    }
    out << cnt << " ";
    swap(segs, next);
  }
  out << '\n';
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  istream& in(std::cin);
  ostream& out(std::cout);
  int T = 1;
  for (int test = 1; test <= T; ++test) {
    solve(test, in, out);
  }
  return 0;
}
