// acm.timus.ru : 1590
#include <cstdio>
#include <cstring>
#define forn(i, n) for (int i = 0; i < n; i++)
const int mlen = 5010;
const int maxv = 2 * mlen;
struct edge
{
int to, l, r;
edge() {}
edge( int _to, int _l, int _r ) : to(_to), l(_l), r(_r) { }
};
char s[mlen + 1];
edge next[maxv][26];
int n, vn = 1, ans = 0;
void add( int l )
{
int v = 0;
while (l < n)
{
edge &e = next[v][(int)s[l]];
if (e.to == 0)
{
e = edge(vn++, l, n);
ans += n - l;
return;
}
int i = e.l;
while (l < n && i < e.r && s[l] == s[i])
l++, i++;
if (l == n)
return;
if (i != e.r)
{
int cur = vn++;
next[cur][(int)s[i]] = edge(e.to, i, e.r);
next[cur][(int)s[l]] = edge(vn++, l, n);
ans += n - l;
e.r = i;
e.to = cur;
return;
}
v = e.to;
}
}
int main()
{
gets(s);
n = strlen(s);
forn(i, n)
s[i] -= 'a';
forn(i, n)
add(i);
printf("%d\n", ans);
return 0;
}