//刚开始ans=n*(n-1)/2没有用ll 一直WA,加了就AC了......
//sa[i]表示排名为i是从sa[i]位置开始的后缀
//rank[i]表示起始位置的下标为i的后缀的排名
// height[i]表示排名相邻的两个后缀的最长公共前缀长度
//https://blog.youkuaiyun.com/a1035719430/article/details/80217267
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1000010;
typedef long long ll;
int n, k;
int sa[maxn] , Rank[maxn] , height[maxn];
int p[maxn] , tmp[maxn] , cnt[maxn];
int s[maxn];
string Tmp;
bool Isequal(int x,int y,int l) {
return (Rank[x] == Rank[y] && Rank[x + l] == Rank[y + l]);
}
void Get_SA() {
// cout << s << " " << n << endl;
for(int i = n; i>=0; --i)
s[i] = s[i - 1];
for(int i = 1; i <= n; ++i) {
Rank[i] = s[i];
sa[i] = i;
}
for(int l = 0 , pos = 0 , sig = 122; pos < n; sig = pos) {
pos = 0;
for(int i = n - l + 1; i <= n; ++i)
p[++pos] = i;
for(int i = 1; i <= n; ++i)
if(sa[i] > l) p[ ++pos ] = sa[i] - l;
memset( cnt , 0 ,sizeof(int) * (sig + 1));
for(int i = 1; i <= n; ++i)
++cnt[Rank[i]];
for(int i = 1; i <= sig; ++i)
cnt[i] += cnt[i - 1];
for(int i = n; i; --i)
sa[cnt[Rank[p[i]]] -- ] = p[i];
pos = 0;
for(int i = 1; i <= n; ++i)
tmp[sa[i]] = Isequal(sa[i] , sa[i - 1] , l)?pos:++pos;
for(int i = 1; i <= n; ++i)
Rank[i] = tmp[i];
l = !l? 1 : l << 1;
}
/* for(int i=1; i<=n; i++) {
cout << Rank[i] << " " << sa[i] << endl;
}*/
return;
}
void CalHeight(int *r,int *sa,int n) {
// cout << "starting" << endl;
for(int i=1,j=1,k=1; i<=n; height[Rank[i++]]=k) {
for(k?--k:0, j=sa[Rank[i]-1]; r[i+k] == r[j+k]; ++k);
// cout << i <<":"<<sa[i] << ":" << Tmp.substr(sa[i]-1) << ":" << Rank[i] << ";"<< k << endl;
}
}
int main() {
int T;
cin >> T;
while(T--) {
cin >> Tmp;
n = Tmp.length();
for(int i=0; i<n; i++){
s[i] = Tmp[i];
} s[n] = 0;
Get_SA();
CalHeight(s, sa, n);
int ans = (ll)n*(n+1)/2;
for(int i = 2; i <= n; i++){
// cout << ans << "-" << height[i] << "=";
ans -= height[i];
// cout << ans << endl;
}
printf("%d\n", ans);
}
return 0;
}