#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using uint = unsigned int;
using ull = unsigned long long;
template <typename T>
using pair2 = pair<T, T>;
using pii = pair<int, int>;
using pli = pair<ll, int>;
using pll = pair<ll, ll>;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll myRand(ll B) { return (ull)rng() % B; }
clock_t startTime;
double getCurrentTime() {
  return (double)(clock() - startTime) / CLOCKS_PER_SEC;
}
const int N = (int)1e6 + 7;
char s[N];
int lst[2];
int a[N];
int nxt[N];
int n;
pii ord[N];
int getNext(int p) { return nxt[p] == p ? p : nxt[p] = getNext(nxt[p]); }
void turnOn(int p) { nxt[p] = p + 1; }
int main() {
  startTime = clock();
  scanf("%d", &n);
  scanf("%s", s);
  lst[0] = lst[1] = n;
  for (int i = n - 1; i >= 0; i--) {
    if (s[i] != '?') lst[(int)(s[i] - '0')] = i;
    a[i] = max(lst[0], lst[1]) - i;
    ord[i] = make_pair(a[i], i);
  }
  for (int i = 0; i < n; i++) nxt[i] = i;
  nxt[n] = n;
  sort(ord, ord + n);
  int l = 0;
  for (int k = 1; k <= n; k++) {
    while (l < n && ord[l].first < k) {
      turnOn(ord[l].second);
      l++;
    }
    int ans = 0;
    int p = 0;
    while (p < n) {
      p = getNext(p);
      if (p == n) break;
      ans++;
      p += k;
    }
    printf("%d ", ans);
  }
  printf("\n");
  return 0;
}
