#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);
}