#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
const int MOD = 998244353;
const int MAXN = 400005;
long long fact[MAXN], inv_fact[MAXN], pow2[MAXN];
long long power(long long base, long long exp) {
long long res = 1;
base %= MOD;
while (exp > 0) {
if (exp % 2 == 1) res = (res * base) % MOD;
base = (base * base) % MOD;
exp /= 2;
}
return res;
}
void precompute() {
fact[0] = 1;
inv_fact[0] = 1;
pow2[0] = 1;
for (int i = 1; i < MAXN; ++i) {
fact[i] = (fact[i - 1] * i) % MOD;
pow2[i] = (pow2[i - 1] * 2) % MOD;
}
inv_fact[MAXN - 1] = power(fact[MAXN - 1], MOD - 2);
for (int i = MAXN - 2; i >= 1; --i) {
inv_fact[i] = (inv_fact[i + 1] * (i + 1)) % MOD;
}
}
long long C(int n, int k) {
if (k < 0 || k > n) return 0;
return fact[n] * inv_fact[k] % MOD * inv_fact[n - k] % MOD;
}
long long get_G(int n, int k) {
if (n < 0) return 0;
long long G = 0;
for (int m = 0; m * (k + 2) <= n; ++m) {
long long term = C(n - m * (k + 1), m);
term = (term * pow2[n - m * (k + 2)]) % MOD;
if (m % 2 == 1) {
G = (G - term + MOD) % MOD;
} else {
G = (G + term) % MOD;
}
}
return G;
}
long long W(int D, int k) {
long long g_d1 = get_G(D + 1, k);
long long g_d = get_G(D, k);
return (g_d1 - g_d + MOD) % MOD;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
precompute();
int N;
if (!(cin >> N)) return 0;
string S;
cin >> S;
vector<int> blocks;
int current_len = 0;
for (int i = 0; i < N; ++i) {
if (S[i] == '.') {
current_len++;
} else {
if (current_len > 0) {
blocks.push_back(current_len);
current_len = 0;
}
}
}
if (current_len > 0) blocks.push_back(current_len);
map<int, int> freq;
for (int b : blocks) freq[b]++;
vector<pair<int, int>> unique_blocks(freq.begin(), freq.end());
vector<long long> F(N + 1, 0);
F[0] = 1;
long long current_pow2_sum = 0;
int block_idx = 0;
for (int k = 1; k <= N; ++k) {
while (block_idx < unique_blocks.size() && unique_blocks[block_idx].first <= k) {
current_pow2_sum += 1LL * unique_blocks[block_idx].first * unique_blocks[block_idx].second;
block_idx++;
}
long long ways = pow2[current_pow2_sum];
for (int i = block_idx; i < unique_blocks.size(); ++i) {
int D = unique_blocks[i].first;
int count = unique_blocks[i].second;
long long w_val = W(D, k);
long long term = power(w_val, count);
ways = (ways * term) % MOD;
}
F[k] = ways;
}
for (int k = 1; k <= N; ++k) {
long long ans = (F[k] - F[k - 1] + MOD) % MOD;
cout << ans << "\n";
}
return 0;
}