#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5;
char s[MAXN + 48];
int n;
stack<pair<long long, long long> > sta;
namespace Suffix_Array {
int cnt[MAXN + 48], fir[MAXN + 48], sec[MAXN + 48], sa[MAXN + 48],
    tmp[MAXN + 48];
int rnk[MAXN + 48], lcp[MAXN + 48];
inline bool compare_sa(int first, int second, int k) {
  if (fir[first] != fir[second]) return fir[first] < fir[second];
  int tmp1 = (first + k <= n ? fir[first + k] : -1),
      tmp2 = (second + k <= n ? fir[second + k] : -1);
  return tmp1 < tmp2;
}
inline void construct_sa(char s[]) {
  int maxind = 'z';
  memset(cnt + 1, 0, maxind << 2);
  for (register int i = 1; i <= n; i++) cnt[s[i]]++;
  for (register int i = 1; i <= maxind; i++) cnt[i] += cnt[i - 1];
  for (register int i = n; i >= 1; i--) sa[cnt[s[i]]--] = i;
  fir[sa[1]] = 1;
  for (register int i = 2; i <= n; i++)
    fir[sa[i]] = fir[sa[i - 1]] + (s[sa[i]] != s[sa[i - 1]]);
  for (register int len = 1; len <= n; len <<= 1) {
    int tot = 0;
    for (register int i = n - len + 1; i <= n; i++) sec[++tot] = i;
    for (register int i = 1; i <= n; i++)
      if (sa[i] > len) sec[++tot] = sa[i] - len;
    memset(cnt + 1, 0, maxind << 2);
    for (register int i = 1; i <= n; i++) cnt[fir[sec[i]]]++;
    for (register int i = 1; i <= maxind; i++) cnt[i] += cnt[i - 1];
    for (register int i = n; i >= 1; i--) sa[cnt[fir[sec[i]]]--] = sec[i];
    tmp[sa[1]] = tot = 1;
    for (register int i = 2; i <= n; i++)
      tmp[sa[i]] = tmp[sa[i - 1]] + compare_sa(sa[i - 1], sa[i], len);
    memcpy(fir + 1, tmp + 1, n << 2);
    maxind = fir[sa[n]];
    if (maxind >= n) break;
  }
}
inline void construct_lcp() {
  int h = 0;
  for (register int i = 1; i <= n; i++) rnk[sa[i]] = i;
  for (register int i = 1; i <= n; i++) {
    int j = sa[rnk[i] - 1];
    if (h) h--;
    while (i + h <= n && j + h <= n && s[i + h] == s[j + h]) h++;
    lcp[rnk[i] - 1] = h;
  }
}
}  // namespace Suffix_Array
int main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  using namespace Suffix_Array;
  construct_sa(s);
  construct_lcp();
  long long ans = 1ll * (n + 1) * n / 2, curans = 0, curcnt;
  for (int i = n - 1; i >= 1; i--) {
    curcnt = 1;
    while (!sta.empty() && lcp[i] < sta.top().first)
      curcnt += sta.top().second, curans -= sta.top().first * sta.top().second,
          sta.pop();
    curans += 1ll * lcp[i] * curcnt;
    ans += curans;
    sta.push(make_pair(lcp[i], curcnt));
  }
  printf("%lld\n", ans);
  return 0;
}
