#include <cstdio>
#include <algorithm>
#include <cstring>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 2000005
#define N 12
#define ll long long
using namespace std;
char str[maxn];
int last=1,tot=1,n,m;
int ch[maxn][N],f[maxn][7],dis[maxn],rk[maxn];
int lst[maxn];
long long C[maxn],ans;
void ins(int c,int id){
int np=++tot,p=last; last=np;
if(ch[p][c]){
int q=ch[p][c];
if(dis[q]==dis[p]+1) last=q;
else {
int nq=++tot; last=nq;
f[nq][id]=f[q][id],dis[nq]=dis[p]+1;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
f[q][id]=nq;
while(p&&ch[p][c]==q) ch[p][c]=nq,p=f[p][id];
}
}
else{
dis[np]=dis[p]+1;
while(p&&!ch[p][c]) { ch[p][c]=np,p=f[p][id]; }
if(!p) f[np][id]=1;
else{
int q=ch[p][c],nq;
if(dis[q]==dis[p]+1) f[np][id]=q;
else{
nq=++tot;
dis[nq]=dis[p]+1;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
f[nq][id]=f[q][id],f[q][id]=f[np][id]=nq;
while(p&&ch[p][c]==q) ch[p][c]=nq,p=f[p][id];
}
}
ans+=(dis[np]-dis[f[np][id]]);
}
}
int main(){
//setIO("input");
//int t; scanf("%d",&t);
//while(t--)
//{
scanf("%s",str+1),n=strlen(str+1);
lst[n+1] = 1;
for (int i = n;i>=1;i--)
{
int j = i+1;
while (str[i]>str[j] && j <= n) {
str[j] = str[i];
j++;
}
last = lst[j];
while (j > i) {
j--;
ins(str[j]-'a',0);
lst[j] = last;
}
}
printf("%lld\n",ans);
last = 1;
//}
return 0;
}