#include<iostream>
#define MAXN 200000
#define SIGMA 26
using namespace std;
struct node {
    int to[SIGMA];
    int maxl;
    int link;
};
int num=1,last=0;
node sa[2*MAXN-1];
int add_node (int maxl) {
    sa[num].maxl=maxl;
    return num++;
}
int add_node (int maxl, node tmp) {
    sa[num]=move(tmp);
    return add_node(maxl);
}
void add_letter (int c) {
    int curr=last;
    last=add_node(sa[last].maxl+1);
    while ((curr!=-1)&&(sa[curr].to[c]==0)) {
        sa[curr].to[c]=last;
        curr=sa[curr].link;
    }
    if (curr==-1) {
        sa[last].link=0;
        return ;
    }
    int nxt=sa[curr].to[c];
    if (sa[curr].maxl+1==sa[nxt].maxl) sa[last].link=nxt;
    else {
        int clone=add_node(sa[curr].maxl+1,sa[nxt]);
        sa[nxt].link=clone;
        sa[last].link=clone;
        while ((curr!=-1)&&(sa[curr].to[c]==nxt)) {
            sa[curr].to[c]=clone;
            curr=sa[curr].link;
        }
    }
}
void add_letter (char c) {
    add_letter(c-'a');
}
int main () {
    string s;
    cin >> s ;
    sa[0].maxl=0;
    sa[0].link=-1;
    long long int cnt=0;
    for (auto c : s) {
        add_letter(c);
        cnt+=sa[last].maxl-sa[sa[last].link].maxl;
        cout << cnt << "\n";
    }
    return 0;
}
