#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
int n;
char s[N];
int nxt[N][2];
vector<int> pos[N][2];
int main() {
  scanf("%d", &n);
  scanf("%s", s + 1);
  vector<int> p;
  for (int i = 1; i <= n; i++)
    if (s[i] == '?') p.push_back(i);
  for (int u : p) s[u] = '0';
  for (int i = 1, j = 1; i <= n; i = j) {
    while (j <= n && s[i] == s[j]) j++;
    if (s[i] == '0') {
      for (int k = i; k < j; k++) nxt[k][0] = j;
      for (int k = 1; k <= j - i; k++) pos[k][0].push_back(i);
    }
  }
  for (int u : p) s[u] = '1';
  for (int i = 1, j = 1; i <= n; i = j) {
    while (j <= n && s[i] == s[j]) j++;
    if (s[i] == '1') {
      for (int k = i; k < j; k++) nxt[k][1] = j;
      for (int k = 1; k <= j - i; k++) pos[k][1].push_back(i);
    }
  }
  for (int u : p) s[u] = '?';
  for (int i = 1; i <= n; i++) {
    int ans = 0;
    for (int l = 1; l <= n;) {
      if (nxt[l][0] - l >= i)
        ans++, l += i;
      else if (nxt[l][1] - l >= i)
        ans++, l += i;
      else {
        int p = n + 1;
        if (lower_bound(pos[i][0].begin(), pos[i][0].end(), l) !=
            pos[i][0].end())
          p = min(p, *lower_bound(pos[i][0].begin(), pos[i][0].end(), l));
        if (lower_bound(pos[i][1].begin(), pos[i][1].end(), l) !=
            pos[i][1].end())
          p = min(p, *lower_bound(pos[i][1].begin(), pos[i][1].end(), l));
        l = p;
      }
    }
    printf("%d ", ans);
  }
  return 0;
}
