#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define R register
const int inf = 0x3f3f3f3f;
const int N = 5e5 + 10;
inline int read() {
char a = getchar(); int x = 0,f = 1;
for(; a>'9' || a<'0'; a = getchar()) if(a == '-') f = -1;
for(;a >= '0' && a <= '9'; a = getchar()) x = x * 10 + a - '0';
return x * f;
}
int n;
char s[N];
int ch[N][26], fa[N], len[N], siz[N];
int las = 1, node = 1;
inline void ins(int c) {
int now = las, p = ++ node; las = p;
len[p] = len[now] + 1; siz[p] = 1;
while(now && ! ch[now][c]) ch[now][c] = p, now = fa[now];
if(!now) { fa[p] = 1; return ; }
int x = ch[now][c];
if(len[now] + 1 == len[x]) { fa[p] = x; return; }
int y = ++ node; len[y] = len[now] + 1; fa[y] = fa[x]; fa[x] = fa[p] = y;
memcpy(ch[y], ch[x], sizeof(ch[y]));
while(now && ch[now][c] == x) ch[now][c] = y, now = fa[now];
}
struct edge { int to, next; } e[N << 1]; int head[N], cnt;
inline void add(int x, int y) { e[ ++ cnt] = { y, head[x] }; head[x] = cnt ; }
inline void dfs(int x) {
for(R int i = head[x]; i ; i = e[i].next ) {
int y = e[i].to; dfs(y);
siz[x] += siz[y];
}
}
int mx[N << 2];
inline int ls(int x) { return x << 1; }
inline int rs(int x) { return x << 1 | 1; }
inline void pushdown(int x) {
mx[ls(x)] = max(mx[ls(x)], mx[x]);
mx[rs(x)] = max(mx[rs(x)], mx[x]);
}
inline void update(int x, int l, int r, int LL, int RR, int k) {
//printf("%d %d\n", LL, RR);
if(LL <= l && r <= RR) { mx[x] = max(mx[x], k); return ;}
pushdown(x);
int mid = (l + r) >> 1;
if( LL <= mid) update(ls(x), l, mid, LL, RR, k);
if(RR > mid) update(rs(x), mid + 1, r , LL, RR, k);
}
inline int ask(int x, int l, int r, int ad) {
if(l == r) return mx[x];
pushdown(x);
int mid = (l + r) >> 1;
if(ad <= mid) return ask(ls(x), l, mid, ad);
else return ask(rs(x), mid + 1, r, ad);
return -1;
}
int main() {
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
scanf("%s", s + 1); n = strlen(s + 1);
for(R int i = 1; i <= n; i ++) ins(s[i] - 'a');
for(R int i = 2; i <= node; i ++) add(fa[i], i);
dfs(1);
// for(R int i = 1; i <= node; i ++) printf("%d ", len[i]);
for(R int i = 2; i <= node; i ++) {
update(1, 1, n, len[fa[i]] + 1, len[i], siz[i]);
}
for(R int i = 1; i <= n; i ++)
printf("%d\n", ask(1, 1, n, i));
return 0;
}