#include <bits/stdc++.h>
using namespace std;
const int maxl = 1e6 + 10;
int n, ans;
vector<int> a[maxl];
int f[maxl], mx[maxl];
int dp[2][maxl];
char s[maxl];
inline void prework() {
  scanf("%d", &n);
  scanf("%s", s + 1);
  for (int i = n; i >= 1; i--) {
    if (s[i] == '?')
      dp[0][i] = dp[0][i + 1] + 1, dp[1][i] = dp[1][i + 1] + 1;
    else if (s[i] == '1')
      dp[0][i] = 0, dp[1][i] = dp[1][i + 1] + 1;
    else
      dp[0][i] = dp[0][i + 1] + 1, dp[1][i] = 0;
    mx[i] = max(dp[0][i], dp[1][i]);
    a[mx[i]].push_back(i);
    f[i] = i;
  }
}
inline int find(int x) {
  if (f[x] != x) f[x] = find(f[x]);
  return f[x];
}
inline void mainwork() {
  int idx;
  f[n + 1] = n + 1;
  for (int i = 1; i <= n; i++) {
    ans = 0;
    idx = 1;
    while (idx <= n) {
      idx = find(idx);
      if (idx > n) break;
      ans++;
      idx += i;
    }
    printf("%d ", ans);
    for (int id : a[i]) f[id] = id + 1;
  }
}
int main() {
  prework();
  mainwork();
  return 0;
}
