#include <bits/stdc++.h>
using namespace std;
struct r_e_d {
  inline int gti() {
    int x = 0, w = 1;
    char ch = getchar();
    while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
    if (ch == '-') w = -1, ch = getchar();
    while (ch >= '0' && ch <= '9')
      x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
    return x * w;
  }
  inline long long gtl() {
    long long x = 0, w = 1;
    char ch = getchar();
    while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
    if (ch == '-') w = -1, ch = getchar();
    while (ch >= '0' && ch <= '9')
      x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
    return x * w;
  }
  inline string gts() {
    string S;
    char ch = getchar();
    while (ch == ' ' || ch == '\n' || ch == '\r') ch = getchar();
    while (ch != ' ' && ch != '\n' && ch != '\r')
      S.push_back(ch), ch = getchar();
    return S;
  }
} RD;
string S;
stack<pair<int, int> > T;
long long as;
struct suffix_array {
  int sa[100005], rk[100005], ha[100005], hs[100005], lb[100005], bn[100005],
      sz, ls;
  void build(string S) {
    ls = S.size() - 1;
    sz = max(255, ls);
    for (int i = (1); i <= (ls); ++i) rk[i] = S[i];
    for (int i = (1); i <= (sz); ++i) bn[i] = 0;
    for (int i = (1); i <= (ls); ++i) ++bn[rk[i]];
    for (int i = (1); i <= (sz); ++i) bn[i] += bn[i - 1];
    for (int i = (1); i <= (ls); ++i) sa[bn[rk[i]]--] = i;
    for (int j = 1; j <= ls; j <<= 1) {
      int tt = 0;
      for (int i = (ls - j + 1); i <= (ls); ++i) lb[++tt] = i;
      for (int i = (1); i <= (ls); ++i)
        if (sa[i] - j >= 1) lb[++tt] = sa[i] - j;
      for (int i = (1); i <= (sz); ++i) bn[i] = 0;
      for (int i = (1); i <= (ls); ++i) ++bn[rk[i]];
      for (int i = (1); i <= (sz); ++i) bn[i] += bn[i - 1];
      for (int i = (ls); i >= (1); --i) sa[bn[rk[lb[i]]]--] = lb[i];
      lb[sa[1]] = 1;
      tt = 1;
      for (int i = (2); i <= (ls); ++i)
        lb[sa[i]] =
            (rk[sa[i]] == rk[sa[i - 1]] && rk[sa[i] + j] == rk[sa[i - 1] + j])
                ? tt
                : ++tt;
      for (int i = (1); i <= (ls); ++i) rk[i] = lb[i];
      if (tt == ls) break;
    }
    for (int i = (1); i <= (ls); ++i) {
      hs[i] = max(hs[i - 1] - 1, 0);
      while (S[i + hs[i]] == S[sa[rk[i] - 1] + hs[i]]) ++hs[i];
      ha[rk[i]] = hs[i];
    }
    for (int i = (ls); i >= (1); --i) hs[i] = hs[i - 1];
  }
  void work() {
    T.push(make_pair(0, 0));
    for (int i = (1); i <= (ls + 1); ++i) {
      while (T.size() && T.top().first > ha[i]) {
        int zi = T.top().first;
        int le = T.top().second;
        T.pop();
        int lm = max(T.top().first, ha[i]);
        as += 1ll * (le + 1) * le / 2 * (zi - lm);
        if (lm == ha[i]) T.push(make_pair(ha[i], 0));
        T.top().second += le;
      }
      T.push(make_pair(ls - sa[i] + 1, 1));
    }
  }
} SA;
int main() {
  S = RD.gts();
  S = ' ' + S;
  SA.build(S);
  SA.work();
  printf("%lld\n", as);
  return 0;
}
