#include <bits/stdc++.h>
using namespace std;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n;
  cin >> n;
  string s;
  cin >> s;
  vector<int> nxt0(n + 1), nxt1(n + 1);
  nxt0[n] = nxt1[n] = n;
  for (int i = n - 1; i >= 0; i--) {
    nxt0[i] = s[i] == '0' ? i : nxt0[i + 1];
    nxt1[i] = s[i] == '1' ? i : nxt1[i + 1];
  }
  vector<vector<int> > p0(n + 1), p1(n + 1);
  int ptr1 = 0, ptr2 = 0;
  while (ptr2 < n) {
    if (s[ptr2] == '1')
      ptr1 = ptr2 + 1;
    else
      p0[ptr2 - ptr1 + 1].push_back(ptr1);
    ++ptr2;
  }
  ptr1 = 0, ptr2 = 0;
  while (ptr2 < n) {
    if (s[ptr2] == '0')
      ptr1 = ptr2 + 1;
    else
      p1[ptr2 - ptr1 + 1].push_back(ptr1);
    ++ptr2;
  }
  for (auto& i : p0) i.push_back(n), sort(i.begin(), i.end());
  for (auto& i : p1) i.push_back(n), sort(i.begin(), i.end());
  for (int x = 1; x <= n; x++) {
    int pos = 0;
    int result = 0;
    while (pos < n) {
      if (s[pos] != '1' and nxt1[pos] - pos >= x) {
        ++result;
        pos += x;
      } else if (s[pos] != '0' and nxt0[pos] - pos >= x) {
        ++result;
        pos += x;
      } else {
        pos = min(*lower_bound(p0[x].begin(), p0[x].end(), pos),
                  *lower_bound(p1[x].begin(), p1[x].end(), pos));
      }
    }
    cout << result << " ";
  }
  cout << "\n";
  return 0;
}
