#include <bits/stdc++.h>
using namespace std;
void solve() {
  long long n;
  cin >> n;
  string s;
  cin >> s;
  long long lst = -1;
  for (long long i = 0; i < (long long)n; ++i)
    if (s[i] != '?') {
      if (lst == -1 || s[lst] == s[i])
        for (long long j = lst + 1; j < i; ++j) s[j] = s[i];
      lst = i;
    }
  if (lst == -1) {
    for (long long i = 1; i <= (long long)n; ++i) cout << n / i << " ";
    return;
  }
  for (long long i = n - 1; s[i] == '?'; --i) s[i] = s[lst];
  vector<pair<long long, long long> > cut;
  lst = 0;
  bool lst_val = s[0] - '0';
  s.push_back(!(s.back() - '0') + '0');
  for (long long i = 0; i < (long long)n + 1; ++i)
    if (s[i] - '0' != lst_val && s[i] != '?') {
      cut.push_back({i - lst, lst});
      lst_val = s[i] - '0';
      lst = i - 1;
      while (s[lst] == '?') --lst;
      ++lst;
    }
  sort(begin(cut), end(cut));
  set<pair<long long, long long> > ask;
  for (pair<long long, long long> p : cut)
    ask.insert({p.second, p.second + p.first - 1});
  long long R = 0;
  for (long long i = 1; i <= (long long)n; ++i) {
    while (R < cut.size() && cut[R].first < i) {
      ask.erase({cut[R].second, cut[R].second + cut[R].first - 1});
      ++R;
    }
    long long ptr = 0, ans = 0;
    for (auto it : ask) {
      ptr = max(ptr, it.first);
      while (ptr + i - 1 <= it.second) {
        ++ans;
        ptr += i;
      }
    }
    cout << ans << " ";
  }
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  solve();
  return 0;
}
