#include <cstdio>
#include <cstring>
#include <cassert>

#define forn(i, n) for (int i = 0; i < (int)(n); i++)

const int N = (int)1e5;
const int VN = N * 2;

struct Edge {
  int start, len, to;
};

char s[N + 1];
int sn, vn = 1, ans;
Edge next[VN][26];

int newV() { assert(vn < VN); return vn++; } 

void add( int i ) {
  int v = 0;
  while (s[i]) {
    int c = s[i] - 'a'; /** 'a'..'z' */
    Edge &r = next[v][c];
    if (!r.len) {
      r = Edge {i, sn - i, newV()};
      ans += sn - i;
      return;
    }
    forn(j, r.len)
      if (s[r.start + j] != s[i + j]) {
        if (s[i + j] == 0)
          return;
        int q = newV();
        int old_c = s[r.start + j] - 'a';
        int new_c = s[i + j] - 'a';
        i += j;
        next[q][new_c] = Edge {i, sn - i, newV()};
        ans += sn - i;
        next[q][old_c] = Edge {r.start + j, r.len - j, r.to};
        r.len = j, r.to = q;
        return;
      }
    i += r.len, v = r.to;
  }
}

int main()
{
  gets(s);
  sn = strlen(s);
  assert(sn <= N);

  for (int i = 0; s[i]; i++)
    add(i);
  printf("%d\n", ans);
}