#include <bits/stdc++.h>
#include <climits>
#define rep(i, begin, end) for (__typeof(end) i = (begin) - ((begin) > (end)); i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
#define srep(i, begin, end) for (__typeof(end) i = begin; i != end; i++)
#define si(x) int x = scanInt();
#define sll(x) LL x = scanLong();
#define sci(x) int x; scanf("%d", &x);
#define scll(x) LL x; scanf("%lld", &x);
#define pi(x) printf("%d ", x)
#define pll(x) printf("%lld ", x)
#define ps(x) printf("%s", x)
#define nl printf("\n")
#define clr(a) memset(a, 0, sizeof(a))
using namespace std;
typedef unsigned int UI; // 32 bit integer
typedef long int LI; // 32 bit integer
typedef unsigned long int ULI; // 32 bit unsigned integer
typedef long long int LL; // 64 bit integer
typedef unsigned long long int ULL; // 64 bit unsigned integer
typedef long double LD;
typedef vector<int> VI;
typedef vector<LL> VLL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
LL mod = 1e9+7;
/* Fast I/O */
inline int scanInt() {
int n = 0;
char ch = getchar();
int sign = 1;
while(ch < '0' || ch > '9') {
if(ch == '-') sign = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9') {
n = (n<<1)+(n<<3)+(int)(ch-'0');
ch = getchar();
}
return n*sign;
}
inline LL scanLong() {
LL n = 0;
char ch = getchar();
LL sign = 1;
while(ch < '0' || ch > '9') {
if(ch == '-') sign = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9') {
n = (n<<1)+(n<<3)+(LL)(ch-'0');
ch = getchar();
}
return n*sign;
}
const LL MAXN = 1010;
const LL MAXLG = 10;
string s;
LL SA[MAXN], HP[MAXLG][MAXN], LCP[MAXN], N;
// HP [i] [j] denotes rank of suffix starting at j sorted according to first 2^i characters.
// If first 2^i characters are same then their rank is same in HP[i].
struct entry{
LL rank, next_rank, index;
bool operator < (entry &oth) {
if(rank == oth.rank) {
if(next_rank == oth.next_rank) return index < oth.index;
return next_rank < oth.next_rank;
}
return rank < oth.rank;
}
} L[MAXN];
void construct() {
rep(i, 0, N) HP[0][i] = (LL)s[i];
LL step = 1, cnt = 1;
while(cnt < N) {
rep(i, 0, N) {
L[i].index = i;
L[i].rank = HP[step-1][i];
L[i].next_rank = (i + cnt < N) ? HP[step-1][i+cnt] : -1;
}
sort(L, L+N);
LL r = 0;
rep(i, 0, N) {
if(i > 0 && L[i].rank == L[i-1].rank && L[i].next_rank == L[i-1].next_rank)
HP[step][L[i].index] = HP[step][L[i-1].index];
else
HP[step][L[i].index] = r++;
}
step++;
cnt <<= 1;
}
rep(i, 0, N) SA[HP[step-1][i]] = i;
rep(i, 0, N) {
if(i == 0) LCP[i] = 0;
else {
LL p = SA[i], q = SA[i-1];
LCP[i] = 0;
rep(x, step, 0) {
if(HP[x][p] == HP[x][q] && p < N && q < N) {
LCP[i] += (((LL)1)<<x);
p += (((LL)1)<<x);
q += (((LL)1)<<x);
}
}
}
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("inp.txt", "r", stdin);
#endif
sll(t);
while(t-->0) {
// write your code here...
cin >> s;
N = s.size();
construct();
rep(i, 0, N) pll(SA[i]); nl;
LL ans = N*(N+1)/2;
rep(i, 0, N) ans -= LCP[i];
pll(ans); nl;
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxjbGltaXRzPgojZGVmaW5lIHJlcChpLCBiZWdpbiwgZW5kKSBmb3IgKF9fdHlwZW9mKGVuZCkgaSA9IChiZWdpbikgLSAoKGJlZ2luKSA+IChlbmQpKTsgaSAhPSAoZW5kKSAtICgoYmVnaW4pID4gKGVuZCkpOyBpICs9IDEgLSAyICogKChiZWdpbikgPiAoZW5kKSkpCiNkZWZpbmUgc3JlcChpLCBiZWdpbiwgZW5kKSBmb3IgKF9fdHlwZW9mKGVuZCkgaSA9IGJlZ2luOyBpICE9IGVuZDsgaSsrKQojZGVmaW5lIHNpKHgpIGludCB4ID0gc2NhbkludCgpOwojZGVmaW5lIHNsbCh4KSBMTCB4ID0gc2NhbkxvbmcoKTsKI2RlZmluZSBzY2koeCkgaW50IHg7IHNjYW5mKCIlZCIsICZ4KTsKI2RlZmluZSBzY2xsKHgpIExMIHg7IHNjYW5mKCIlbGxkIiwgJngpOwojZGVmaW5lIHBpKHgpIHByaW50ZigiJWQgIiwgeCkKI2RlZmluZSBwbGwoeCkgcHJpbnRmKCIlbGxkICIsIHgpCiNkZWZpbmUgcHMoeCkgcHJpbnRmKCIlcyIsIHgpCiNkZWZpbmUgbmwgcHJpbnRmKCJcbiIpCiNkZWZpbmUgY2xyKGEpIG1lbXNldChhLCAwLCBzaXplb2YoYSkpCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgdW5zaWduZWQgaW50IFVJOyAvLyAzMiBiaXQgaW50ZWdlcgp0eXBlZGVmIGxvbmcgaW50IExJOyAvLyAzMiBiaXQgaW50ZWdlcgp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IFVMSTsgLy8gMzIgYml0IHVuc2lnbmVkIGludGVnZXIKdHlwZWRlZiBsb25nIGxvbmcgaW50IExMOyAvLyA2NCBiaXQgaW50ZWdlcgp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgIFVMTDsgLy8gNjQgYml0IHVuc2lnbmVkIGludGVnZXIKdHlwZWRlZiBsb25nIGRvdWJsZSBMRDsKdHlwZWRlZiB2ZWN0b3I8aW50PiBWSTsKdHlwZWRlZiB2ZWN0b3I8TEw+IFZMTDsKdHlwZWRlZiBwYWlyPGludCwgaW50PiBQSUk7CnR5cGVkZWYgcGFpcjxMTCwgTEw+IFBMTDsKTEwgbW9kID0gMWU5Kzc7CgovKiBGYXN0IEkvTyAqLwppbmxpbmUgaW50IHNjYW5JbnQoKSB7CglpbnQgbiA9IDA7CgljaGFyIGNoID0gZ2V0Y2hhcigpOwoJaW50IHNpZ24gPSAxOwoJd2hpbGUoY2ggPCAnMCcgfHwgY2ggPiAnOScpIHsKCQlpZihjaCA9PSAnLScpCXNpZ24gPSAtMTsKCQljaCA9IGdldGNoYXIoKTsKCX0KCXdoaWxlKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKCQluID0gKG48PDEpKyhuPDwzKSsoaW50KShjaC0nMCcpOwoJCWNoID0gZ2V0Y2hhcigpOwoJfQoJcmV0dXJuIG4qc2lnbjsKfQoKaW5saW5lIExMIHNjYW5Mb25nKCkgewoJTEwgbiA9IDA7CgljaGFyIGNoID0gZ2V0Y2hhcigpOwoJTEwgc2lnbiA9IDE7Cgl3aGlsZShjaCA8ICcwJyB8fCBjaCA+ICc5JykgewoJCWlmKGNoID09ICctJykJc2lnbiA9IC0xOwoJCWNoID0gZ2V0Y2hhcigpOwoJfQoJd2hpbGUoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgewoJCW4gPSAobjw8MSkrKG48PDMpKyhMTCkoY2gtJzAnKTsKCQljaCA9IGdldGNoYXIoKTsKCX0KCXJldHVybiBuKnNpZ247Cn0KCmNvbnN0IExMIE1BWE4gPSAxMDEwOwpjb25zdCBMTCBNQVhMRyA9IDEwOwpzdHJpbmcgczsKTEwgU0FbTUFYTl0sIEhQW01BWExHXVtNQVhOXSwgTENQW01BWE5dLCBOOwovLyBIUCBbaV0gW2pdCWRlbm90ZXMgcmFuayBvZiBzdWZmaXggc3RhcnRpbmcgYXQgaiBzb3J0ZWQgYWNjb3JkaW5nIHRvIGZpcnN0IDJeaSBjaGFyYWN0ZXJzLgovLyBJZiBmaXJzdCAyXmkgY2hhcmFjdGVycyBhcmUgc2FtZSB0aGVuIHRoZWlyIHJhbmsgaXMgc2FtZSBpbiBIUFtpXS4KCnN0cnVjdCBlbnRyeXsKCUxMIHJhbmssIG5leHRfcmFuaywgaW5kZXg7Cglib29sIG9wZXJhdG9yIDwgKGVudHJ5ICZvdGgpIHsKCQlpZihyYW5rID09IG90aC5yYW5rKSB7CgkJCWlmKG5leHRfcmFuayA9PSBvdGgubmV4dF9yYW5rKQlyZXR1cm4gaW5kZXggPCBvdGguaW5kZXg7CgkJCXJldHVybiBuZXh0X3JhbmsgPCBvdGgubmV4dF9yYW5rOwoJCX0KCQlyZXR1cm4gcmFuayA8IG90aC5yYW5rOwoJfQp9IExbTUFYTl07Cgp2b2lkIGNvbnN0cnVjdCgpIHsKCXJlcChpLCAwLCBOKQlIUFswXVtpXSA9IChMTClzW2ldOwoJTEwgc3RlcCA9IDEsIGNudCA9IDE7Cgl3aGlsZShjbnQgPCBOKSB7CgkJcmVwKGksIDAsIE4pIHsKCQkJTFtpXS5pbmRleCA9IGk7CgkJCUxbaV0ucmFuayA9IEhQW3N0ZXAtMV1baV07CgkJCUxbaV0ubmV4dF9yYW5rID0gKGkgKyBjbnQgPCBOKSA/IEhQW3N0ZXAtMV1baStjbnRdIDogLTE7CgkJfQoJCXNvcnQoTCwgTCtOKTsKCQlMTCByID0gMDsKCQlyZXAoaSwgMCwgTikgewoJCQlpZihpID4gMCAmJiBMW2ldLnJhbmsgPT0gTFtpLTFdLnJhbmsgJiYgTFtpXS5uZXh0X3JhbmsgPT0gTFtpLTFdLm5leHRfcmFuaykKCQkJCUhQW3N0ZXBdW0xbaV0uaW5kZXhdID0gSFBbc3RlcF1bTFtpLTFdLmluZGV4XTsKCQkJZWxzZQoJCQkJSFBbc3RlcF1bTFtpXS5pbmRleF0gPSByKys7CgkJfQoJCXN0ZXArKzsKCQljbnQgPDw9IDE7Cgl9CglyZXAoaSwgMCwgTikJU0FbSFBbc3RlcC0xXVtpXV0gPSBpOwoJcmVwKGksIDAsIE4pIHsKCQlpZihpID09IDApCUxDUFtpXSA9IDA7CgkJZWxzZSB7CgkJCUxMIHAgPSBTQVtpXSwgcSA9IFNBW2ktMV07CgkJCUxDUFtpXSA9IDA7CgkJCXJlcCh4LCBzdGVwLCAwKSB7CgkJCQlpZihIUFt4XVtwXSA9PSBIUFt4XVtxXSAmJiBwIDwgTiAmJiBxIDwgTikgewkKCQkJCQlMQ1BbaV0gKz0gKCgoTEwpMSk8PHgpOwoJCQkJCXAgKz0gKCgoTEwpMSk8PHgpOwoJCQkJCXEgKz0gKCgoTEwpMSk8PHgpOwoJCQkJfQoJCQl9CgkJfQoJfQp9CgoKaW50IG1haW4oKSB7CiNpZm5kZWYgT05MSU5FX0pVREdFCglmcmVvcGVuKCJpbnAudHh0IiwgInIiLCBzdGRpbik7CiNlbmRpZgoJc2xsKHQpOwoJd2hpbGUodC0tPjApIHsKCQkvLyB3cml0ZSB5b3VyIGNvZGUgaGVyZS4uLgoJCWNpbiA+PiBzOwoJCU4gPSBzLnNpemUoKTsKCQljb25zdHJ1Y3QoKTsKCQlyZXAoaSwgMCwgTikJcGxsKFNBW2ldKTsgbmw7CgkJTEwgYW5zID0gTiooTisxKS8yOwoJCXJlcChpLCAwLCBOKQlhbnMgLT0gTENQW2ldOwoJCXBsbChhbnMpOyBubDsKCX0KfQo=