#include <bits/stdc++.h>
using namespace std;
const int N = 100000;
char s[N + 2];
int sa[N + 2], sa2[N + 2], r[N + 2], r2[N + 2], c[N + 2];
int n, a = 128;
int lcp[N + 2], rsa[N + 2];
vector<pair<int, int>> v;
long long ans = 0;
void merge(int x, int y) {
  if (v[x].first != v[y].first) return;
  v[x].second += v[y].second;
  v.erase(v.begin() + y);
}
void reduce(int x, int val) {
  ans += ((long long)v[x].first - val) * v[x].second * (v[x].second + 1);
  v[x].first = val;
}
int main() {
  scanf("%s", s);
  n = strlen(s);
  for (int i = 0; i < n; i++) c[r[i] = s[i]]++;
  for (int i = 1; i < a; i++) c[i] += c[i - 1];
  for (int i = n - 1; i >= 0; i--) sa[--c[r[i]]] = i;
  for (int l = 1; l < n; l *= 2) {
    int p = 0;
    for (int i = n - l; i < n; i++) sa2[p++] = i;
    for (int i = 0; i < n; i++)
      if (sa[i] - l >= 0) sa2[p++] = sa[i] - l;
    for (int i = 0; i < a; i++) c[i] = 0;
    for (int i = 0; i < n; i++) c[r[i]]++;
    for (int i = 1; i < a; i++) c[i] += c[i - 1];
    for (int i = n - 1; i >= 0; i--) sa[--c[r[sa2[i]]]] = sa2[i];
    r2[sa[0]] = 0;
    for (int i = 1; i < n; i++) {
      r2[sa[i]] = r2[sa[i - 1]] + 1;
      if (r[sa[i - 1]] == r[sa[i]] && sa[i - 1] + l < n &&
          r[sa[i - 1] + l] == r[sa[i] + l])
        r2[sa[i]]--;
    }
    for (int i = 0; i < n; i++) swap(r[i], r2[i]);
    a = r[sa[n - 1]] + 1;
    if (a == n) break;
  }
  for (int i = 0; i < n; i++) rsa[sa[i]] = i;
  for (int i = 0, k = 0; i < n; i++, k = max(0, k - 1)) {
    if (rsa[i] == n - 1) {
      lcp[rsa[i]] = k = 0;
      continue;
    }
    int j = sa[rsa[i] + 1];
    while (max(i, j) + k < n && s[i + k] == s[j + k]) k++;
    lcp[rsa[i]] = k;
  }
  for (int i = 0; i < n; i++) {
    v.push_back({lcp[i], 1});
    while (1) {
      if (v.size() == 1) break;
      if (v.size() == 2) {
        if (v[0].first == v[1].first)
          merge(0, 1);
        else if (v[0].first > v[1].first) {
          reduce(0, v[1].first);
          merge(0, 1);
        }
        break;
      }
      int x = v.size() - 3;
      if (v[x + 1].first < v[x + 2].first)
        break;
      else if (v[x + 1].first == v[x + 2].first)
        merge(x + 1, x + 2);
      else {
        reduce(x + 1, max(v[x].first, v[x + 2].first));
        merge(x, x + 1);
      }
    }
    if (v.back().first == 0) v.pop_back();
  }
  ans += (long long)n * (n + 1);
  ans /= 2;
  printf("%lld\n", ans);
}
