#include <bits/stdc++.h>
using namespace std;
vector<int> suffixArray(string &s, int S) {
int n=s.size(); int N=n+S;
vector<int> sa(n), ra(n);
for (int i=0;i<n;i++) {sa[i]=i;ra[i]=s[i]; }
for (int k=0;k<n;k?k*=2:k++) {
vector<int> nsa(sa), nra(n), cnt(N);
for (int i=0;i<n;i++) nsa[i]=(nsa[i]-k+n)%n;
for (int i=0;i<n;i++) cnt[ra[i]]++;
for (int i=1;i<N;i++) cnt[i]+=cnt[i-1];
for (int i=n-1;i>=0;i--) sa[--cnt[ra[nsa[i]]]]=nsa[i];
int r=0;
for (int i=1;i<n;i++) {
if(ra[sa[i]]!=ra[sa[i-1]]) r++;
else if(ra[(sa[i]+k)%n]!=ra[(sa[i-1]+k)%n]) r++;
nra[sa[i]]=r;
}
ra=nra;
}
return sa;
}
vector<int> lcpArray(string &s, vector<int> sa) {
int n=s.size(), k=0;
vector<int> ra(n), lcp(n);
for (int i=0;i<n;i++) ra[sa[i]]=i;
for (int i=0;i<n;i++) {
if (k) k--;
if (ra[i]==n-1) {
k=0;
continue;
}
int j=sa[ra[i]+1];
while (k<n && s[(i+k)%n]==s[(j+k)%n]) k++;
lcp[ra[i]]=k;
if (ra[(sa[ra[i]]+1)%n]>ra[(sa[ra[j]]+1)%n]) k=0;
}
return lcp;
}
int main() {
string s;
cin >> s;
auto s2=s+"$";
auto sa = suffixArray(s2, 256);
auto lcp = lcpArray(s2, sa);
int r = s.size()*(s.size()+1)/2;
//for (int i : lcp) cout << i << " "; cout << endl;
for (int i = 0; i < sa.size(); i++) {
r -= lcp[i];
}
cout << r << endl;
}