// Решение задачи acm.timus.ru : 1590
#include <cstdio>
#include <cstring>
#define forn(i, n) for (int i = 0; i < (n); i++)
enum { maxn = 5010, maxv = maxn * 2 };
int Last; // Последняя вершина
int N; // Количество существующих вершин, нумеруются они 1..N-1
int Len[maxv]; // Len[v] = длина максимальной строки входящей в v
int Suf[maxv]; // Суффиксная ссылка вершины
int Next[maxv][26]; // Ребра, торчащие из вершины
int NewV( int l, int suf ) // Создание новой вершины
{
Len[N] = l, Suf[N] = suf;
return N++;
}
void BuildAutomaton( char *s )
{
int n = strlen(s);
N = 1, Last = NewV(0, 0); // Корень = вершина с номером 1
forn(i, n)
{
int ch = s[i] - 'a';
int P = Last;
Last = NewV(Len[Last] + 1, 0);
while (!Next[P][ch])
Next[P][ch] = Last, P = Suf[P];
if (!P)
Suf[Last] = 1;
else
{
int Q = Next[P][ch];
if (Len[Q] == Len[P] + 1)
Suf[Last] = Q;
else
{
int R = NewV(Len[P] + 1, Suf[Q]);
Suf[Last] = Suf[Q] = R;
memcpy(Next[R], Next[Q], sizeof(Next[R]));
while (P && Next[P][ch] == Q)
Next[P][ch] = R, P = Suf[P];
}
}
}
}
char s[maxn];
int n, F[maxv], u[maxv];
void dfs( int v )
{
int x;
u[v] = 1;
forn(i, 26)
if ((x = Next[v][i]) != 0)
{
if (!u[x])
dfs(x);
F[v] += F[x];
}
}
int main()
{
gets(s);
BuildAutomaton(s);
forn(i, N)
u[i] = 0, F[i] = 1;
dfs(1);
printf("%d\n", F[1] - 1);
return 0;
}