#include <bits/stdc++.h>
using namespace std;
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  string s;
  cin >> s;
  vector<int> n1(n), n2(n);
  vector<vector<int>> p1(n + 1), p2(n + 1);
  if (s[n - 1] == '?' || s[n - 1] == '1') n1[n - 1] = 1;
  if (s[n - 1] == '?' || s[n - 1] == '0') n2[n - 1] = 1;
  for (int i = n - 2; i >= 0; i--) {
    if (s[i] == '?' || s[i] == '1') {
      n1[i] = n1[i + 1] + 1;
    } else {
      for (int j = 1; j <= n1[i + 1]; j++) p1[j].push_back(i + 1);
    }
    if (s[i] == '?' || s[i] == '0') {
      n2[i] = n2[i + 1] + 1;
    } else {
      for (int j = 1; j <= n2[i + 1]; j++) p2[j].push_back(i + 1);
    }
  }
  for (int j = 1; j <= n1[0]; j++) p1[j].push_back(0);
  for (int j = 1; j <= n2[0]; j++) p2[j].push_back(0);
  for (int i = 0; i < n; i++) {
    reverse(p1[i].begin(), p1[i].end());
    reverse(p2[i].begin(), p2[i].end());
  }
  for (int x = 1; x <= n; x++) {
    int pos = 0;
    int ans = 0;
    while (pos < n) {
      if (n1[pos] >= x || n2[pos] >= x) {
        ans++;
        pos += x;
        continue;
      }
      int id1 = lower_bound(p1[x].begin(), p1[x].end(), pos) - p1[x].begin();
      int id2 = lower_bound(p2[x].begin(), p2[x].end(), pos) - p2[x].begin();
      if (id1 == p1[x].size() && id2 == p2[x].size()) break;
      int next = n + 2;
      if (id1 < p1[x].size() && next > p1[x][id1]) {
        next = p1[x][id1];
      }
      if (id2 < p2[x].size() && next > p2[x][id2]) {
        next = p2[x][id2];
      }
      ans++;
      pos = next + x;
    }
    cout << ans << " ";
  }
  cout << "\n";
  return 0;
}
