#include <bits/stdc++.h>
using namespace std;
const int N = 1000050;
char s[N];
set<pair<int, int> > st[2];
vector<pair<int, int> > del[2][N];
int n;
int Search(int t, int ptr, int sz) {
  auto it = st[t].lower_bound({ptr + 1, -N});
  if (it != st[t].begin()) {
    if (prev(it)->second >= ptr + sz - 1) return ptr + sz - 1;
  }
  if (it != st[t].end()) return it->first + sz - 1;
  return n + 1;
}
int main() {
  scanf("%i", &n);
  scanf("%s", s + 1);
  int cnt1 = 0, cnt2 = 0;
  for (int i = 1; i <= n + 1; i++) {
    if (s[i] == '0' || s[i] == '?') {
      cnt1++;
    } else {
      if (cnt1) st[0].insert({i - cnt1, i - 1});
      cnt1 = 0;
    }
    if (s[i] == '1' || s[i] == '?') {
      cnt2++;
    } else {
      if (cnt2) st[1].insert({i - cnt2, i - 1});
      cnt2 = 0;
    }
  }
  for (pair<int, int> p : st[0]) del[0][p.second - p.first + 1].push_back(p);
  for (pair<int, int> p : st[1]) del[1][p.second - p.first + 1].push_back(p);
  for (int i = 1; i <= n; i++) {
    int ptr = 0, ans = 0;
    while (ptr <= n) {
      int ptr1 = Search(0, ptr + 1, i);
      int ptr2 = Search(1, ptr + 1, i);
      ans++;
      ptr = min(ptr1, ptr2);
    }
    printf("%i ", ans - 1);
    for (pair<int, int> p : del[0][i]) st[0].erase(p);
    for (pair<int, int> p : del[1][i]) st[1].erase(p);
  }
  return 0;
}
