// Решение задачи 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;
}