int lcs(char* s,char* t)
    {
        int l1 = strlen(s);
        int l2 = strlen(t);
        sa_init( );
        for(int i=0;i < l1;i++)
            sa_extend(s[i]);
                 
        int v = 0,l = 0,best = 0,bestpos = 0;
        for(int i=0;i < l2;i++) 
        {
            while(v && !st[v].next.count(t[i])) 
            {
                v = st[v].link;
                l = st[v].len;
            }

            if(st[v].next.count(t[i])) 
            {
                v = st[v].next[t[i]];
                ++l;
            }
            if(l > best)
                best = l,bestpos = i;
        }
        return best;
    }
    string lcs(string s,string t)
    {
        sa_init( );
        for(int i=0;i<(int)s.length( );i++)
            sa_extend(s[i]);
                 
        int v = 0,l = 0,best = 0,bestpos = 0;
        for(int i=0;i<(int)t.length();i++) 
        {
            while(v && !st[v].next.count(t[i])) 
            {
                v = st[v].link;
                l = st[v].len;
            }

            if(st[v].next.count(t[i])) 
            {
                v = st[v].next[t[i]];
                ++l;
            }
            if(l > best)
                best = l,bestpos = i;
        }
        return t.substr(bestpos - best + 1,best);
    }
string lcs ( string s, string t ) {
    sa_init ( ) ;
    int slen = s.length() , tlen = t.length() ;
    rep(i,slen) sa_extend ( s [ i ] ) ;
    int v = 0 ,  l = 0 , best = 0 ,  bestpos = 0 ;
    rep(i,tlen)
    {
        while ( v && ! st [ v ] . next.count ( t[i] ) ) {
            v = st [v].link ;
            l = st [v].len ;
        }
        if ( st [v] . next.count ( t[i] ) ) {
            v = st [v].next [ t [i] ] ;
            ++l ;
        }
        if ( l > best ) best = l,  bestpos = i ;
    }
    return t. substr ( bestpos - best + 1 , best ) ;
}
int main() {
    long start_time = clock();

    size_t size, last;
    std::vector<state> states = sa_init(size, last);
    char c;
    while (std::cin.get(c)) {
        if(c == '\n') break;
        sa_extend(states, size, last, c);
    }

    std::vector<long long> visited_st(2*last, -1); // cache for calculated states
    long long m = count_for_st(visited_st, states, 0);

    std::cout << m << std::endl;

    long total_time = clock() - start_time;
    char buffer[50];
    sprintf(buffer, "Total time: %ld", total_time);
    LOG(1, buffer);

    return 0;
}
void process(const string &s) {
    sa_init();
    forn(i,si(s)) sa_extend(s[i]);
}