#include <bits/stdc++.h>

using namespace std;

struct vertex
{
    static const int k=16;
    int h;
    map<int,vertex*> to;
    vertex *up[k];

    vertex():h(0){for(auto &it:up)it=this;}

    bool add(char t)
    {
        if(to[t]) return 0;
        vertex *temp=new vertex;
        temp->h=this->h+1;
        temp->up[0]=this;
        for(int i=1;i<k;i++)
            temp->up[i]=temp->up[i-1]->up[i-1];
        to[t]=temp;
        return 1;
    }

    vertex *up_to(int H)
    {
        H=h-H;
        vertex *ret=this;
        for(int i=k;i>=0;i--)
            if((1<<i)<=H)ret=ret->up[i],H-=1<<i;
        return ret;
    }
};

template<int delta> struct base
{
private:
    vector<int> rad;
    string text;
    int i;
    int n;

    vector<vertex*> link;
    vertex *root;

public:

    base():i(1),n(0)
    {
        text.push_back('$');
        rad.push_back(0);
        root=new vertex;
        link.push_back(root);
    }

    bool add_letter(char t)
    {
        int r=0;
        text+=t;
        rad.push_back(0);
        link.push_back(root);

        int s=i;
        for(; i<=n+delta; i++)
        {
            link[i]=link[s-(i-s)]->up_to(n-i+delta);
            rad[i]=min(rad[s-(i-s)],n-i+delta);

            if(text[i-rad[i]]==text[i+rad[i]+1-delta])
            {
                r=link[i]->add(t);
                link[i]=link[i]->to[t];
                rad[i]++;
                break;
            }
        }
        n++;
        return r;
    }
};

struct manacher
{
private:
    base<0> even;
    base<1> odd;

public:
    int add_letter(char t)
    {
        return odd.add_letter(t)+even.add_letter(t);
    }
} me;

main()
 {
    ios::sync_with_stdio(0);
    cin.tie(0);
    char t;
    int cur(0);
    while((t=getchar())!='\n')
        cout<<(cur+=me.add_letter(t))<<' ';
    cout<<"\n";
}
