#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
template <typename T>
using vec = vector<T>;
template <typename T>
using Prior = priority_queue<T>;
template <typename T>
using prior = priority_queue<T, vec<T>, greater<T>>;
const int INF = 1e9 + 1;
const ll LLINF = (ll)4 * 1e18;
const ll MOD = 1e9 + 7;
const double PI = 3.14159265358;
const double EPS = 1e-8;
const int xx[8] = {0, 1, 0, -1, 1, 1, -1, -1};
const int yy[8] = {1, 0, -1, 0, 1, -1, -1, 1};
template <typename T>
void dbg(T x) {
  cerr << x << '\n';
}
template <typename T, typename... A>
void dbg(T x, A... y) {
  cerr << x << ", ";
  dbg(y...);
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
template <typename T>
void amax(T &a, T b) {
  if (a < b) a = b;
}
template <typename T>
void amin(T &a, T b) {
  if (a > b) a = b;
}
void pmod(ll &a, ll b) { a = (a + b) % MOD; }
void mmod(ll &a, ll b) { a = (a - b + MOD) % MOD; }
void tmod(ll &a, ll b) { a = (a * b) % MOD; }
void UNI(vec<int> &v) {
  sort(v.begin(), v.end());
  v.resize(unique(v.begin(), v.end()) - v.begin());
}
int getint() {
  int ret;
  cin >> ret;
  return ret;
}
ll POW(ll a, ll b) {
  ll res = 1;
  do {
    if (b % 2) tmod(res, a);
    tmod(a, a);
  } while (b >>= 1);
  return res;
}
ll getll() {
  ll ret;
  cin >> ret;
  return ret;
}
const int MXN = 1000000;
const int N = MXN + 10;
void solve() {
  int n;
  string s;
  cin >> n >> s;
  vec<int> v(n + 1);
  for (int i = 0; i < (n); i++) {
    if (s[i] == '0') v[i + 1] = 1;
    if (s[i] == '1') v[i + 1] = 2;
    if (s[i] == '?') v[i + 1] = 3;
  }
  vec<vec<int>> dp(2, vec<int>(n + 2));
  for (int i = n; i; i--) {
    if (v[i] & 1) dp[0][i] = dp[0][i + 1] + 1;
    if (v[i] & 2) dp[1][i] = dp[1][i + 1] + 1;
  }
  vec<int> nxt(n + 1);
  vec<vec<int>> ins(n + 1);
  for (int i = 1; i <= (n); i++) {
    nxt[i] = max(dp[0][i], dp[1][i]);
    if (nxt[i] >= nxt[i - 1]) ins[nxt[i]].emplace_back(i);
  }
  set<int> st;
  vec<int> ans, mem;
  for (int i = n; i; i--) {
    for (auto j : ins[i]) {
      st.insert(j);
      mem.emplace_back(j + 1);
    }
    int idx = 1, ret = 0;
    if (st.empty()) {
      ans.emplace_back(0);
      continue;
    }
    while (idx <= n && idx <= *st.rbegin()) {
      if (nxt[idx] >= i) {
        ret++;
        idx += i;
      } else {
        if (idx == *st.rbegin()) break;
        idx = *st.upper_bound(idx);
      }
    }
    ans.emplace_back(ret);
    for (auto &j : mem) st.insert(j++);
  }
  for (int i = n - 1; i >= 0; i--) cout << ans[i] << ' ';
  cout << '\n';
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int T = 1;
  while (T--) {
    solve();
  }
}
