#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 100;
const int mod = 1e9 + 7;
mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0);
  int n;
  cin >> n;
  string s;
  cin >> s;
  vector<pair<char, int> > v;
  for (int i = 0; i < (int)s.size(); i++) {
    int j = i - 1;
    while (j + 1 < (int)s.size() && s[j + 1] == s[i]) {
      j++;
    }
    v.push_back({s[i], j - i + 1});
    i = j;
  }
  for (int i = 0; i < (int)v.size(); i++) {
    if (v[i].first != '?') {
      continue;
    }
    if (i == 0) {
      if (i == (int)v.size() - 1) {
        v[i].first = '1';
      } else {
        v[i].first = v[i + 1].first;
      }
    } else if (i == (int)v.size() - 1) {
      v[i].first = v[i - 1].first;
    } else {
      if (v[i - 1].first == v[i + 1].first) {
        v[i].first = v[i - 1].first;
      }
    }
  }
  vector<pair<char, int> > u;
  for (int i = 0; i < (int)v.size(); i++) {
    int j = i - 1;
    int total = 0;
    while (j + 1 < (int)v.size() && v[j + 1].first == v[i].first) {
      j++;
      total += v[j].second;
    }
    u.push_back({v[i].first, total});
    i = j;
  }
  vector<int> answer(n + 1), siz(n + 1);
  vector<vector<int> > kiek((int)u.size());
  for (int i = 0; i < (int)u.size(); i++) {
    if (u[i].first != '?') {
      siz[i] = u[i].second;
      if (i > 0 && u[i - 1].first == '?') {
        siz[i] += u[i - 1].second;
      }
      if (i < (int)u.size() - 1 && u[i + 1].first == '?') {
        siz[i] += u[i + 1].second;
      }
    }
  }
  for (int i = 0; i < (int)u.size(); i++) {
    if (u[i].first == '?') {
      int cnt = u[i].second;
      if (i > 0) {
        cnt = max(cnt, siz[i - 1]);
      }
      if (i < (int)u.size() - 1) {
        cnt = max(cnt, siz[i + 1]);
      }
      kiek[i].resize(cnt + 1);
      for (int j = 1; j <= cnt; j++) {
        kiek[i][j] = u[i].second;
      }
    }
  }
  for (int i = 0; i < (int)u.size(); i++) {
    if (u[i].first != '?') {
      int upto = u[i].second;
      if (i > 0 && u[i - 1].first == '?') {
        upto += u[i - 1].second;
      }
      if (i < (int)u.size() - 1 && u[i + 1].first == '?') {
        upto += u[i + 1].second;
      }
      for (int j = 1; j <= upto; j++) {
        int toLeft = 0, toRight = 0;
        if (i > 0 && u[i - 1].first == '?') {
          toLeft += kiek[i - 1][j];
        }
        if (i < (int)u.size() - 1 && u[i + 1].first == '?') {
          toRight += kiek[i + 1][j];
        }
        answer[j] += (u[i].second + toLeft + toRight) / j;
        if (i < (int)u.size() - 1 && u[i + 1].first == '?') {
          int remaining = min(toRight, (u[i].second + toLeft + toRight) % j);
          kiek[i + 1][j] = remaining;
        }
      }
    }
  }
  for (int k = 1; k <= n; k++) {
    cout << answer[k] << " ";
  }
  cout << "\n";
  return 0;
}
