#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 = 3e5 + 2;
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;
pii base[N], f1[N], f2[N];
int prefix[N];
int minusMod(int a, int b, int mod) {
return ((a % mod) - (b % mod) + mod) % mod;
}
int mulMod(int a, int b, int mod) {
return ((a % mod) * (b % mod)) % mod;
}
void calBase() {
base[0].fi = 1;
base[0].se = 1;
FOR(i, 1, n, 1) {
base[i].fi = (base[i - 1].fi * 256) % mod1;
base[i].se = (base[i - 1].se * 256) % mod2;
}
}
void hashing(int o, string s, pii *f) {
if (o == 1) {
FOR(i, 1, n, 1) {
f[i].fi = (f[i - 1].fi * 256 + s[i]) % mod1;
f[i].se = (f[i - 1].se * 256 + s[i]) % mod2;
}
}
if (o == 2) {
FOD(i, n, 1, 1) {
f[i].fi = (f[i + 1].fi * 256 + s[i]) % mod1;
f[i].se = (f[i + 1].se * 256 + s[i]) % mod2;
}
}
}
pii getHash(int o, int l, int r, pii *f) {
if (o == 1) {
int x = minusMod(f[r].fi, mulMod(f[l - 1].fi, base[r - l + 1].fi, mod1), mod1);
int y = minusMod(f[r].se, mulMod(f[l - 1].se, base[r - l + 1].se, mod2), mod2);
return {x, y};
}
if (o == 2) {
int x = minusMod(f[l].fi, mulMod(f[r + 1].fi, base[r - l + 1].fi, mod1), mod1);
int y = minusMod(f[l].se, mulMod(f[r + 1].se, base[r - l + 1].se, mod2), mod2);
return {x, y};
}
}
void input() {
cin >> s;
n = s.size(); s = ' ' + s;
calBase();
hashing(1, s, f1);
hashing(2, s, f2);
}
int check(int l, int r) {
if (l == r) return 1;
int len = r - l + 1;
if (len % 2 == 1) {
int mid = (l + r) / 2;
pii hash_1 = getHash(1, l, mid, f1);
pii hash_2 = getHash(2, mid, r, f2);
if (hash_1 == hash_2) {
return check(l, mid - 1) + 1;
}
}
if (len % 2 == 0) {
int mid = (l + r) / 2;
pii hash_1 = getHash(1, l, mid, f1);
pii hash_2 = getHash(2, mid + 1, r, f2);
if (hash_1 == hash_2) {
return check(l, mid) + 1;
}
}
return 0;
}
void solve() {
input();
FOR(i, 1, n, 1) FOR(j, i, n, 1) {
int l = i;
int r = j;
int len = r - l + 1;
int x = check(l, r);
if (x == 0) continue;
// cout << x << " " << l << " " << r << '\n';
prefix[1] ++;
prefix[x + 1] --;
}
FOR(i, 1, n, 1) {
prefix[i] = prefix[i - 1] + prefix[i];
}
FOR(i, 1, n, 1) {
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+CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBpbnQgbG9uZyBsb25nCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTiA9IDNlNSArIDI7CmNvbnN0IGludCBNID0gMzUwOwpjb25zdCBpbnQgbW9kMSA9IDFlOSArIDc7CmNvbnN0IGludCBtb2QyID0gMmU5ICsgMTE7CmNvbnN0IGludCBMT0cgPSAxOTsKY29uc3QgbG9uZyBsb25nIGluZiA9IDNlMTg7CgpzdHJpbmcgcywgdDsKaW50IG47CnBpaSBiYXNlW05dLCBmMVtOXSwgZjJbTl07CmludCBwcmVmaXhbTl07CgppbnQgbWludXNNb2QoaW50IGEsIGludCBiLCBpbnQgbW9kKSB7CiAgICByZXR1cm4gKChhICUgbW9kKSAtIChiICUgbW9kKSArIG1vZCkgJSBtb2Q7Cn0KaW50IG11bE1vZChpbnQgYSwgaW50IGIsIGludCBtb2QpIHsKICAgIHJldHVybiAoKGEgJSBtb2QpICogKGIgJSBtb2QpKSAlIG1vZDsKfQp2b2lkIGNhbEJhc2UoKSB7CiAgICBiYXNlWzBdLmZpID0gMTsKICAgIGJhc2VbMF0uc2UgPSAxOwogICAgRk9SKGksIDEsIG4sIDEpIHsKICAgICAgICBiYXNlW2ldLmZpID0gKGJhc2VbaSAtIDFdLmZpICogMjU2KSAlIG1vZDE7CiAgICAgICAgYmFzZVtpXS5zZSA9IChiYXNlW2kgLSAxXS5zZSAqIDI1NikgJSBtb2QyOwogICAgfQp9CnZvaWQgaGFzaGluZyhpbnQgbywgc3RyaW5nIHMsIHBpaSAqZikgewogICAgaWYgKG8gPT0gMSkgewogICAgICAgIEZPUihpLCAxLCBuLCAxKSB7CiAgICAgICAgICAgIGZbaV0uZmkgPSAoZltpIC0gMV0uZmkgKiAyNTYgKyBzW2ldKSAlIG1vZDE7CiAgICAgICAgICAgIGZbaV0uc2UgPSAoZltpIC0gMV0uc2UgKiAyNTYgKyBzW2ldKSAlIG1vZDI7CiAgICAgICAgfQogICAgfQogICAgaWYgKG8gPT0gMikgewogICAgICAgIEZPRChpLCBuLCAxLCAxKSB7CiAgICAgICAgICAgIGZbaV0uZmkgPSAoZltpICsgMV0uZmkgKiAyNTYgKyBzW2ldKSAlIG1vZDE7CiAgICAgICAgICAgIGZbaV0uc2UgPSAoZltpICsgMV0uc2UgKiAyNTYgKyBzW2ldKSAlIG1vZDI7CiAgICAgICAgfQogICAgfQp9CnBpaSBnZXRIYXNoKGludCBvLCBpbnQgbCwgaW50IHIsIHBpaSAqZikgewogICAgaWYgKG8gPT0gMSkgewogICAgICAgIGludCB4ID0gbWludXNNb2QoZltyXS5maSwgbXVsTW9kKGZbbCAtIDFdLmZpLCBiYXNlW3IgLSBsICsgMV0uZmksIG1vZDEpLCBtb2QxKTsKICAgICAgICBpbnQgeSA9IG1pbnVzTW9kKGZbcl0uc2UsIG11bE1vZChmW2wgLSAxXS5zZSwgYmFzZVtyIC0gbCArIDFdLnNlLCBtb2QyKSwgbW9kMik7CiAgICAgICAgcmV0dXJuIHt4LCB5fTsKICAgIH0KICAgIGlmIChvID09IDIpIHsKICAgICAgICBpbnQgeCA9IG1pbnVzTW9kKGZbbF0uZmksIG11bE1vZChmW3IgKyAxXS5maSwgYmFzZVtyIC0gbCArIDFdLmZpLCBtb2QxKSwgbW9kMSk7CiAgICAgICAgaW50IHkgPSBtaW51c01vZChmW2xdLnNlLCBtdWxNb2QoZltyICsgMV0uc2UsIGJhc2VbciAtIGwgKyAxXS5zZSwgbW9kMiksIG1vZDIpOwogICAgICAgIHJldHVybiB7eCwgeX07CiAgICB9Cn0Kdm9pZCBpbnB1dCgpIHsKICAgIGNpbiA+PiBzOwogICAgbiA9IHMuc2l6ZSgpOyBzID0gJyAnICsgczsKICAgIGNhbEJhc2UoKTsKICAgIGhhc2hpbmcoMSwgcywgZjEpOwogICAgaGFzaGluZygyLCBzLCBmMik7Cn0KaW50IGNoZWNrKGludCBsLCBpbnQgcikgewogICAgaWYgKGwgPT0gcikgcmV0dXJuIDE7CiAgICBpbnQgbGVuID0gciAtIGwgKyAxOwogICAgaWYgKGxlbiAlIDIgPT0gMSkgewogICAgICAgIGludCBtaWQgPSAobCArIHIpIC8gMjsKICAgICAgICBwaWkgaGFzaF8xID0gZ2V0SGFzaCgxLCBsLCBtaWQsIGYxKTsKICAgICAgICBwaWkgaGFzaF8yID0gZ2V0SGFzaCgyLCBtaWQsIHIsIGYyKTsKICAgICAgICBpZiAoaGFzaF8xID09IGhhc2hfMikgewogICAgICAgICAgICByZXR1cm4gY2hlY2sobCwgbWlkIC0gMSkgKyAxOwogICAgICAgIH0KICAgIH0KICAgIGlmIChsZW4gJSAyID09IDApIHsKICAgICAgICBpbnQgbWlkID0gKGwgKyByKSAvIDI7CiAgICAgICAgcGlpIGhhc2hfMSA9IGdldEhhc2goMSwgbCwgbWlkLCBmMSk7CiAgICAgICAgcGlpIGhhc2hfMiA9IGdldEhhc2goMiwgbWlkICsgMSwgciwgZjIpOwogICAgICAgIGlmIChoYXNoXzEgPT0gaGFzaF8yKSB7CiAgICAgICAgICAgIHJldHVybiBjaGVjayhsLCBtaWQpICsgMTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQp2b2lkIHNvbHZlKCkgewogICAgaW5wdXQoKTsKICAgIEZPUihpLCAxLCBuLCAxKSBGT1IoaiwgaSwgbiwgMSkgewogICAgICAgIGludCBsID0gaTsKICAgICAgICBpbnQgciA9IGo7CiAgICAgICAgaW50IGxlbiA9IHIgLSBsICsgMTsKCiAgICAgICAgaW50IHggPSBjaGVjayhsLCByKTsKICAgICAgICBpZiAoeCA9PSAwKSBjb250aW51ZTsKLy8gICAgICAgIGNvdXQgPDwgeCA8PCAiICIgPDwgbCA8PCAiICIgPDwgciA8PCAnXG4nOwogICAgICAgIHByZWZpeFsxXSArKzsKICAgICAgICBwcmVmaXhbeCArIDFdIC0tOwogICAgfQogICAgRk9SKGksIDEsIG4sIDEpIHsKICAgICAgICBwcmVmaXhbaV0gPSBwcmVmaXhbaSAtIDFdICsgcHJlZml4W2ldOwogICAgfQogICAgRk9SKGksIDEsIG4sIDEpIHsKICAgICAgICBjb3V0IDw8IHByZWZpeFtpXSA8PCAiICI7CiAgICB9Cn0Kc2lnbmVkIG1haW4oKSB7CiAgICAjZGVmaW5lIG5hbWUgImJhaXRhcCIKICAgIGlmIChpZnN0cmVhbShuYW1lIi5pbnAiKSkgewogICAgICAgIGZyZW9wZW4obmFtZSIuaW5wIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbihuYW1lIi5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKICAgIHNvbHZlKCk7Cn0K