#include <bits/stdc++.h>
using namespace std;
long long power(long long a, long long b) {
  long long ans = 1;
  while (b > 0) {
    if (b & 1) {
      ans = (ans * a) % 1000000007;
    }
    a = (a * a) % 1000000007;
    b >>= 1;
  }
  return ans;
}
int find(int i, int a[]) {
  if (a[i] == i) return i;
  return a[i] = find(a[i], a);
}
void uni(int i, int j, int a[], int sz[]) {
  int x = find(i, a);
  int y = find(j, a);
  if (sz[x] > sz[y])
    a[y] = x;
  else
    a[x] = y;
  sz[x] += sz[y];
  sz[y] = sz[x];
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n;
  cin >> n;
  string s;
  cin >> s;
  stack<int> s1;
  int a[n];
  for (int i = 0; i < n; i++) {
    if (s[i] == '?') continue;
    while (!s1.empty() && s[s1.top()] != s[i]) {
      a[s1.top()] = i;
      s1.pop();
    }
    s1.push(i);
  }
  while (!s1.empty()) {
    a[s1.top()] = n;
    s1.pop();
  }
  a[n - 1] = n;
  for (int i = n - 2; i >= 0; i--) {
    if (s[i] == '?') a[i] = a[i + 1];
  }
  vector<pair<int, int> > v;
  set<int> s3;
  for (int i = 0; i < n; i++) {
    v.push_back({a[i] - i, i});
    s3.insert(i);
  }
  sort(v.begin(), v.end());
  int k = 0;
  for (int i = 1; i <= n; i++) {
    int j = 0;
    int ans = 0;
    while (j + i - 1 < n) {
      if (j + i <= a[j]) {
        j += i;
        ans++;
      } else {
        auto it = s3.lower_bound(j);
        if (it == s3.end()) break;
        ans++;
        j = *it + i;
      }
    }
    while (k < n && v[k].first <= i) {
      s3.erase(v[k].second);
      k++;
    }
    cout << ans << " ";
  }
  return 0;
}
