// 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;
}