#include <bits/stdc++.h>
#define ll long long
#define all(v) v.begin(),v.end()
#define MASK(i) (1LL << (i))
#define ii pair<int,int>
#define fi first
#define se second
#define endl '\n'
using namespace std;
mt19937 rd(chrono::steady_clock::now().time_since_epoch().count());
#define rand rd
long long Rand(long long l , long long h){
assert(l <= h);
return l + 1ll * rd() % (h - l + 1) * (rd() % (h - l + 1)) % (h - l + 1);
}
const int MAX = 4e3 + 5 , MOD = 998244353;
int n;
short a[MAX];
int dp[MAX][MAX];
int presum[MAX][MAX];
void add(int &x , int y){
x = x + y;
if(x >= MOD) x = x - MOD;
}
void INP(){
{
string tmp;
cin >> tmp;
n = tmp.size();
for(int i = 1 ; i <= n ; i++) a[i] = int(tmp[i - 1]) - int('a');
}
for(int i = 1 ; i <= n ; i++){
for(int j = n ; j >= i ; j--){
if(a[i] == a[j]){
dp[i][j] = presum[i - 1][j + 1];
add(dp[i][j] , 1);
}
}
for(int j = n ; j >= i ; j--){
presum[i][j] = presum[i - 1][j];
add(dp[i][j] , dp[i][j + 1]);
add(presum[i][j] , dp[i][j]);
}
}
for(int i = 1 ; i <= n ; i++) for(int j = 1 ; j <= n ; j++) dp[i][j] = 0;
for(int i = n ; i >= 1 ; i--){
for(int j = i ; j <= n ; j++){
if(a[i] == a[j]){
dp[i][j] = 1;
add(dp[i][j] , dp[i + 1][j - 1]);
}
}
int congthem = 0;
for(int j = i ; j <= n ; j++){
int tmp = congthem;
add(congthem , dp[i][j]);
add(dp[i][j] , tmp);
add(dp[i][j] , dp[i + 1][j]);
}
}
for(int i = 1 ; i <= n ; i++){
int res = 1;
add(res , presum[i - 1][i + 1]);
for(int j = 1 ; j < i ; j++) if(a[j] == a[i]){
add(res , 1ll * (presum[j - 1][i + 1] + 1) * (dp[j + 1][i - 1] + 1) % MOD);
}
for(int j = n ; j > i ; j--) if(a[i] == a[j]){
add(res , 1ll * (presum[i - 1][j + 1] + 1) * (dp[i + 1][j - 1] + 1) % MOD);
}
cout << res << ' ';
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
#define TASK ""
//freopen(TASK".inp" , "r" , stdin);
//freopen(TASK".out" , "w" , stdout);
INP();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgYWxsKHYpIHYuYmVnaW4oKSx2LmVuZCgpCiNkZWZpbmUgTUFTSyhpKSAoMUxMIDw8IChpKSkKI2RlZmluZSBpaSBwYWlyPGludCxpbnQ+CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBlbmRsICdcbicKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCm10MTk5MzcgcmQoY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKI2RlZmluZSByYW5kIHJkCgpsb25nIGxvbmcgUmFuZChsb25nIGxvbmcgbCAsIGxvbmcgbG9uZyBoKXsKCWFzc2VydChsIDw9IGgpOwoJcmV0dXJuIGwgKyAxbGwgKiByZCgpICUgKGggLSBsICsgMSkgKiAocmQoKSAlIChoIC0gbCArIDEpKSAlIChoIC0gbCArIDEpOwp9Cgpjb25zdCBpbnQgTUFYID0gNGUzICsgNSAsIE1PRCA9IDk5ODI0NDM1MzsKaW50IG47CnNob3J0IGFbTUFYXTsKaW50IGRwW01BWF1bTUFYXTsKaW50IHByZXN1bVtNQVhdW01BWF07Cgp2b2lkIGFkZChpbnQgJnggLCBpbnQgeSl7CiAgICB4ID0geCArIHk7CiAgICBpZih4ID49IE1PRCkgeCA9IHggLSBNT0Q7Cn0KCnZvaWQgSU5QKCl7CiAgICB7CiAgICAgICAgc3RyaW5nIHRtcDsKICAgICAgICBjaW4gPj4gdG1wOwogICAgICAgIG4gPSB0bXAuc2l6ZSgpOwogICAgICAgIGZvcihpbnQgaSA9IDEgOyBpIDw9IG4gOyBpKyspIGFbaV0gPSBpbnQodG1wW2kgLSAxXSkgLSBpbnQoJ2EnKTsKICAgIH0KICAgIGZvcihpbnQgaSA9IDEgOyBpIDw9IG4gOyBpKyspewogICAgICAgIGZvcihpbnQgaiA9IG4gOyBqID49IGkgOyBqLS0pewogICAgICAgICAgICBpZihhW2ldID09IGFbal0pewogICAgICAgICAgICAgICAgZHBbaV1bal0gPSBwcmVzdW1baSAtIDFdW2ogKyAxXTsKICAgICAgICAgICAgICAgIGFkZChkcFtpXVtqXSAsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvcihpbnQgaiA9IG4gOyBqID49IGkgOyBqLS0pewogICAgICAgICAgICBwcmVzdW1baV1bal0gPSBwcmVzdW1baSAtIDFdW2pdOwogICAgICAgICAgICBhZGQoZHBbaV1bal0gLCBkcFtpXVtqICsgMV0pOwogICAgICAgICAgICBhZGQocHJlc3VtW2ldW2pdICwgZHBbaV1bal0pOwogICAgICAgIH0KICAgIH0KICAgIGZvcihpbnQgaSA9IDEgOyBpIDw9IG4gOyBpKyspIGZvcihpbnQgaiA9IDEgOyBqIDw9IG4gOyBqKyspIGRwW2ldW2pdID0gMDsKICAgIGZvcihpbnQgaSA9IG4gOyBpID49IDEgOyBpLS0pewogICAgICAgIGZvcihpbnQgaiA9IGkgOyBqIDw9IG4gOyBqKyspewogICAgICAgICAgICBpZihhW2ldID09IGFbal0pewogICAgICAgICAgICAgICAgZHBbaV1bal0gPSAxOwogICAgICAgICAgICAgICAgYWRkKGRwW2ldW2pdICwgZHBbaSArIDFdW2ogLSAxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaW50IGNvbmd0aGVtID0gMDsKICAgICAgICBmb3IoaW50IGogPSBpIDsgaiA8PSBuIDsgaisrKXsKICAgICAgICAgICAgaW50IHRtcCA9IGNvbmd0aGVtOwogICAgICAgICAgICBhZGQoY29uZ3RoZW0gLCBkcFtpXVtqXSk7CiAgICAgICAgICAgIGFkZChkcFtpXVtqXSAsIHRtcCk7CiAgICAgICAgICAgIGFkZChkcFtpXVtqXSAsIGRwW2kgKyAxXVtqXSk7CiAgICAgICAgfQogICAgfQoKICAgIGZvcihpbnQgaSA9IDEgOyBpIDw9IG4gOyBpKyspewogICAgICAgIGludCByZXMgPSAxOwogICAgICAgIGFkZChyZXMgLCBwcmVzdW1baSAtIDFdW2kgKyAxXSk7CiAgICAgICAgZm9yKGludCBqID0gMSA7IGogPCBpIDsgaisrKSBpZihhW2pdID09IGFbaV0pewogICAgICAgICAgICBhZGQocmVzICwgMWxsICogKHByZXN1bVtqIC0gMV1baSArIDFdICsgMSkgKiAoZHBbaiArIDFdW2kgLSAxXSArIDEpICUgTU9EKTsKICAgICAgICB9CiAgICAgICAgZm9yKGludCBqID0gbiA7IGogPiBpIDsgai0tKSBpZihhW2ldID09IGFbal0pewogICAgICAgICAgICBhZGQocmVzICwgMWxsICogKHByZXN1bVtpIC0gMV1baiArIDFdICsgMSkgKiAoZHBbaSArIDFdW2ogLSAxXSArIDEpICUgTU9EKTsKICAgICAgICB9CiAgICAgICAgY291dCA8PCByZXMgPDwgJyAnOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZSgwKTsKICAgIGNvdXQudGllKDApOwogICAgI2RlZmluZSBUQVNLICIiCiAgICAvL2ZyZW9wZW4oVEFTSyIuaW5wIiAsICJyIiAsIHN0ZGluKTsKICAgIC8vZnJlb3BlbihUQVNLIi5vdXQiICwgInciICwgc3Rkb3V0KTsKICAgIElOUCgpOwogICAgcmV0dXJuIDA7Cn0=