#include <bits/stdc++.h>
#pragma GCC optimaze("Ofast");
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,tune=native")
#pragma GCC optimize("unroll-loops")
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
struct suff_arr {
  vector<int> p, c, np, nc, h, lcp, p2;
  string s;
  int n;
  suff_arr(string &s) {
    this->s = s + char(0);
    this->n = this->s.size();
  }
  int mode1(int a, int k, int n) { return (a + (1 << k)) % n; }
  int mode2(int a, int k, int n) { return (a - (1 << k) + n) % n; }
  bool prov(int i, int j, int k) {
    return c[i] != c[j] || c[mode1(i, (k - 1), n)] != c[mode1(j, (k - 1), n)];
  }
  void build() {
    p.resize(n);
    c = np = nc = h = p;
    vector<pair<char, int>> in;
    for (int i = 0; i < s.size(); i++) in.push_back({s[i], i});
    sort(in.begin(), in.end());
    p[0] = in[0].second;
    int g = c[p[0]] = h[0] = 0, k = 1;
    for (int i = 1; i < n; i++) {
      p[i] = in[i].second;
      if (in[i - 1].first != in[i].first) g++, h[g] = i;
      c[p[i]] = g;
    }
    while (1 << (k - 1) < n) {
      for (int i = 0; i < n; i++) {
        int v = mode2(p[i], (k - 1), n);
        np[h[c[v]]++] = v;
      }
      nc[np[0]] = h[0] = g = 0;
      for (int i = 1; i < n; i++) {
        if (prov(np[i - 1], np[i], k)) g++, h[g] = i;
        nc[np[i]] = g;
      }
      c = nc, p = np, k++;
      if (g == n) break;
    }
  }
  void build_lcp() {
    lcp.resize(n);
    p2.resize(n);
    for (int i = 0; i < n; i++) p2[p[i]] = i;
    for (int i = 0; i < n; i++) {
      if (i > 0) lcp[p2[i]] = max(lcp[p2[i - 1]] - 1, 0);
      while (p2[i] + 1 < n && s[i + lcp[p2[i]]] == s[p[p2[i] + 1] + lcp[p2[i]]])
        lcp[p2[i]]++;
    }
  }
};
signed main() {
  srand(1);
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.setf(ios::fixed);
  cout.precision(10);
  string s;
  cin >> s;
  suff_arr ms(s);
  ms.build();
  ms.build_lcp();
  int n = s.size();
  stack<pair<int, pair<int, long long>>> tu;
  long long ans = 1LL * n * (n + 1) / 2;
  for (int i = 0; i < ms.n; i++) {
    int x = ms.lcp[i];
    while (tu.size() && tu.top().first > x) tu.pop();
    if (tu.size()) {
      long long sum = 0;
      sum += tu.top().second.second;
      sum += 1LL * (i - tu.top().second.first) * x;
      tu.push({x, {i, sum}});
      ans += sum;
    } else
      tu.push({x, {i, 0}});
  }
  cout << ans;
}
