#include <bits/stdc++.h>
using namespace std;
long long mod = 1000000007;
long long inf = 1LL << 50;
const int N = 1000000;
int arr[N];
struct block {
  bool type;
  int sz;
  int mx;
  int nxt;
  int prev;
  int wall;
  block(int s, int m, bool t) {
    sz = s;
    mx = m;
    type = t;
  }
};
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin.exceptions(cin.failbit);
  int n;
  cin >> n;
  string str;
  cin >> str;
  for (int i = 0; i < n; i++) {
    if (str[i] == '0') {
      arr[i] = 0;
    } else if (str[i] == '1') {
      arr[i] = 1;
    } else {
      arr[i] = 2;
    }
  }
  vector<block> blocks;
  blocks.emplace_back(0, 0, true);
  int sz = 0;
  bool type = true;
  int wall = 0;
  int lst = arr[0];
  int lstI = -1;
  int dublast = -1;
  for (int i = 0; i < n; i++) {
    if (arr[i] == 2) {
      continue;
    }
    if (arr[i] != lst) {
      if (type) {
        blocks.back().nxt = blocks.size();
        blocks.emplace_back(i - lstI - 1, sz + i - lstI - 1, true);
        blocks.back().prev = blocks.size() - 2;
        sz = i - lstI;
        dublast = lstI;
        lst = arr[i];
        lstI = i;
      } else {
        blocks.back().nxt = blocks.size();
        blocks.emplace_back(i - lstI - 1, sz + i - lstI - 1, false);
        blocks.back().prev = blocks.size() - 2;
        blocks.back().wall = i - wall - 1;
        sz = i - wall;
        dublast = wall;
        lst = arr[i];
        lstI = i;
        type = true;
      }
    } else {
      type = false;
      wall = i;
    }
  }
  if (type) {
    blocks.back().nxt = blocks.size();
    blocks.emplace_back(n - lstI - 1, sz + n - lstI - 1, true);
    blocks.back().prev = blocks.size() - 2;
  } else {
    blocks.back().nxt = blocks.size();
    blocks.emplace_back(n - lstI - 1, sz + n - lstI - 1, false);
    blocks.back().prev = blocks.size() - 2;
    blocks.back().wall = n - wall - 1;
  }
  blocks.back().nxt = -1;
  for (int i = 1; i <= n; i++) {
    sz = 0;
    int curr = blocks[0].nxt;
    int ans = 0;
    while (curr != -1) {
      if (blocks[curr].mx < i) {
        blocks[blocks[curr].prev].nxt = blocks[curr].nxt;
        if (blocks[curr].nxt != -1) {
          blocks[blocks[curr].nxt].prev = blocks[curr].prev;
        }
        curr = blocks[curr].nxt;
        continue;
      }
      if (blocks[curr].prev != curr - 1) {
        sz = blocks[curr].mx - blocks[curr].sz;
      }
      ans += (blocks[curr].sz + sz) / i;
      if (blocks[curr].type) {
        sz = min((blocks[curr].sz + sz) % i + 1, blocks[curr].sz + 1);
      } else {
        sz = (blocks[curr].sz + sz) % i;
        if (sz > blocks[curr].wall) {
          sz = blocks[curr].wall;
        }
        sz++;
      }
      curr = blocks[curr].nxt;
    }
    cout << ans << " ";
  }
  cout << "\n";
}
