#include <bits/stdc++.h>
#define FOR(i, l, r, x) for(int i = l; i <= r; i += x)
#define FOD(i, l, r, x) for(int i = l; i >= r; i -= x)
#define pub push_back
#define pii pair<int, int>
#define fi first
#define se second
#define int long long
using namespace std;
const int N = 4000 + 5;
const int M = 350;
const int mod1 = 1e9 + 7;
const int mod2 = 2e9 + 11;
const int LOG = 19;
const long long inf = 3e18;
string s, t;
int n;
bool is[N][N];
int f[N][N], prefix[N];
void input() {
cin >> s;
n = s.size();
s = ' ' + s;
}
void solve() {
input();
FOR(i, 1, n, 1) {
is[i][i] = 1;
f[i][i] = 1;
}
FOR(i, 1, n - 1, 1) {
if (s[i] == s[i + 1]) {
is[i][i + 1] = 1;
f[i][i + 1] = 2;
}
}
FOD(i, n, 1, 1) {
FOR(j, i + 1, n, 1) {
if (is[i][j]) continue;
if (s[i] == s[j]) {
is[i][j] = (is[i][j] || is[i + 1][j - 1]);
if (is[i][j]) {
int mid = (i + j) >> 1;
int len = j - i + 1;
if (len % 2 == 1) {
f[i][j] = f[i][mid - 1] + 1;
}
if (len % 2 == 0) {
f[i][j] = f[i][mid] + 1;
}
}
}
}
}
FOR(i, 1, n, 1) FOR(j, i, n, 1) {
if (is[i][j]) {
int x = f[i][j];
if (x == 0) continue;
prefix[1] ++;
prefix[x + 1] --;
}
}
FOR(i, 1, n, 1) {
prefix[i] = prefix[i - 1] + prefix[i];
cout << prefix[i] << " ";
}
}
signed main() {
#define name "baitap"
if (ifstream(name".inp")) {
freopen(name".inp", "r", stdin);
freopen(name".out", "w", stdout);
}
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
solve();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgRk9SKGksIGwsIHIsIHgpIGZvcihpbnQgaSA9IGw7IGkgPD0gcjsgaSArPSB4KQojZGVmaW5lIEZPRChpLCBsLCByLCB4KSBmb3IoaW50IGkgPSBsOyBpID49IHI7IGkgLT0geCkKI2RlZmluZSBwdWIgcHVzaF9iYWNrCiNkZWZpbmUgcGlpIHBhaXI8aW50LCBpbnQ+CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBpbnQgbG9uZyBsb25nCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTiA9IDQwMDAgKyA1Owpjb25zdCBpbnQgTSA9IDM1MDsKY29uc3QgaW50IG1vZDEgPSAxZTkgKyA3Owpjb25zdCBpbnQgbW9kMiA9IDJlOSArIDExOwpjb25zdCBpbnQgTE9HID0gMTk7CmNvbnN0IGxvbmcgbG9uZyBpbmYgPSAzZTE4OwoKc3RyaW5nIHMsIHQ7CmludCBuOwpib29sIGlzW05dW05dOwppbnQgZltOXVtOXSwgcHJlZml4W05dOwoKdm9pZCBpbnB1dCgpIHsKICAgIGNpbiA+PiBzOwogICAgbiA9IHMuc2l6ZSgpOwogICAgcyA9ICcgJyArIHM7Cn0Kdm9pZCBzb2x2ZSgpIHsKICAgIGlucHV0KCk7CiAgICBGT1IoaSwgMSwgbiwgMSkgewogICAgICAgIGlzW2ldW2ldID0gMTsKICAgICAgICBmW2ldW2ldID0gMTsKICAgIH0KICAgIEZPUihpLCAxLCBuIC0gMSwgMSkgewogICAgICAgIGlmIChzW2ldID09IHNbaSArIDFdKSB7CiAgICAgICAgICAgIGlzW2ldW2kgKyAxXSA9IDE7CiAgICAgICAgICAgIGZbaV1baSArIDFdID0gMjsKICAgICAgICB9CiAgICB9CiAgICBGT0QoaSwgbiwgMSwgMSkgewogICAgICAgIEZPUihqLCBpICsgMSwgbiwgMSkgewogICAgICAgICAgICBpZiAoaXNbaV1bal0pIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAoc1tpXSA9PSBzW2pdKSB7CiAgICAgICAgICAgICAgICBpc1tpXVtqXSA9IChpc1tpXVtqXSB8fCBpc1tpICsgMV1baiAtIDFdKTsKICAgICAgICAgICAgICAgIGlmIChpc1tpXVtqXSkgewogICAgICAgICAgICAgICAgICAgIGludCBtaWQgPSAoaSArIGopID4+IDE7CiAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IGogLSBpICsgMTsKICAgICAgICAgICAgICAgICAgICBpZiAobGVuICUgMiA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZbaV1bal0gPSBmW2ldW21pZCAtIDFdICsgMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiAlIDIgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBmW2ldW2pdID0gZltpXVttaWRdICsgMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBGT1IoaSwgMSwgbiwgMSkgRk9SKGosIGksIG4sIDEpIHsKICAgICAgICBpZiAoaXNbaV1bal0pIHsKICAgICAgICAgICAgaW50IHggPSBmW2ldW2pdOwogICAgICAgICAgICBpZiAoeCA9PSAwKSBjb250aW51ZTsKICAgICAgICAgICAgcHJlZml4WzFdICsrOwogICAgICAgICAgICBwcmVmaXhbeCArIDFdIC0tOwogICAgICAgIH0KICAgIH0KICAgIEZPUihpLCAxLCBuLCAxKSB7CiAgICAgICAgcHJlZml4W2ldID0gcHJlZml4W2kgLSAxXSArIHByZWZpeFtpXTsKICAgICAgICBjb3V0IDw8IHByZWZpeFtpXSA8PCAiICI7CiAgICB9Cn0Kc2lnbmVkIG1haW4oKSB7CiAgICAjZGVmaW5lIG5hbWUgImJhaXRhcCIKICAgIGlmIChpZnN0cmVhbShuYW1lIi5pbnAiKSkgewogICAgICAgIGZyZW9wZW4obmFtZSIuaW5wIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbihuYW1lIi5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKICAgIHNvbHZlKCk7Cn0K