#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
#define REP(i, n) for (int i = 0; i < (int)(n); ++i)
using namespace std;
int a[1000004];
char S[1000002];
int N, gap;
int sa[1000002], pos[1000002], tmp[1000002], lcp[1000002];
char s[100];
bool myfunc(int i, int j)
{
if (pos[i] != pos[j])
return pos[i] < pos[j];
i += gap;
j += gap;
return (i < N && j < N) ? pos[i] < pos[j] : i > j;
}
// Building suffix array.
void SA()
{
N = strlen(S);
for(int i=0;i<N;i++){
sa[i] = i;
pos[i] = S[i];
}
for (gap = 1;; gap *= 2)
{
sort(sa, sa + N, myfunc);
for(int i=0;i<N-1;i++){
tmp[i + 1] = tmp[i] + myfunc(sa[i], sa[i + 1]);
}
for(int i=0; i<N;i++)
{
pos[sa[i]] = tmp[i];
}
if (tmp[N - 1] == N - 1) break;
}
}
// Building LCP array.
void LCP()
{
for (int i = 0, k = 0; i < N; ++i) if (pos[i] != N - 1)
{
for (int j = sa[pos[i] + 1]; S[i + k] == S[j + k];)
++k;
lcp[pos[i]] = k;
if(k)
--k;
}
}
void solve()
{
SA();
LCP();
long long int ans = N;
ans = (ans*(ans+1))/2;
long long int k = 0;
for(int i=0;i<N;i++)
{
k+=lcp[pos[i]];
}
ans = ans - k;
ans%=1000000009;
//printf("%lld\n",ans);
}
int main()
{
int t,n;
scanf("%d", &t);
while(t--)
{
int zz=0;
scanf("%s",&S);
n=strlen(S);
if(n==1)
{
printf("0\n");
continue;
}
solve();
for(int i=0;i<n;i++)
cout<<sa[i]<<endl;
}
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGNzdHJpbmc+CiNpbmNsdWRlPGNzdGRpbz4KI2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZTxhbGdvcml0aG0+CiNkZWZpbmUgUkVQKGksIG4pIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCkobik7ICsraSkKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAppbnQgYVsxMDAwMDA0XTsKY2hhciBTWzEwMDAwMDJdOwppbnQgTiwgZ2FwOwppbnQgc2FbMTAwMDAwMl0sIHBvc1sxMDAwMDAyXSwgdG1wWzEwMDAwMDJdLCBsY3BbMTAwMDAwMl07CiBjaGFyIHNbMTAwXTsKYm9vbCBteWZ1bmMoaW50IGksIGludCBqKQp7CiAgaWYgKHBvc1tpXSAhPSBwb3Nbal0pCiAgICByZXR1cm4gcG9zW2ldIDwgcG9zW2pdOwogIGkgKz0gZ2FwOwogIGogKz0gZ2FwOwogIHJldHVybiAoaSA8IE4gJiYgaiA8IE4pID8gcG9zW2ldIDwgcG9zW2pdIDogaSA+IGo7Cn0KLy8gQnVpbGRpbmcgc3VmZml4IGFycmF5Lgp2b2lkIFNBKCkKewogIE4gPSBzdHJsZW4oUyk7CiAgZm9yKGludCBpPTA7aTxOO2krKyl7CiAgICBzYVtpXSA9IGk7CiAgICBwb3NbaV0gPSBTW2ldOwogIH0KICBmb3IgKGdhcCA9IDE7OyBnYXAgKj0gMikKICB7CiAgICBzb3J0KHNhLCBzYSArIE4sIG15ZnVuYyk7CiAgICBmb3IoaW50IGk9MDtpPE4tMTtpKyspewogICAgICB0bXBbaSArIDFdID0gdG1wW2ldICsgbXlmdW5jKHNhW2ldLCBzYVtpICsgMV0pOwogICAgfQogICAgZm9yKGludCBpPTA7IGk8TjtpKyspCiAgICB7CiAgICAgIHBvc1tzYVtpXV0gPSB0bXBbaV07CiAgICB9CiAgICBpZiAodG1wW04gLSAxXSA9PSBOIC0gMSkgYnJlYWs7CiAgfQp9Ci8vIEJ1aWxkaW5nIExDUCBhcnJheS4Kdm9pZCBMQ1AoKQp7CiAgZm9yIChpbnQgaSA9IDAsIGsgPSAwOyBpIDwgTjsgKytpKSBpZiAocG9zW2ldICE9IE4gLSAxKQogIHsKICAgIGZvciAoaW50IGogPSBzYVtwb3NbaV0gKyAxXTsgU1tpICsga10gPT0gU1tqICsga107KQogICAgICArK2s7CiAgICBsY3BbcG9zW2ldXSA9IGs7CiAgICBpZihrKQogICAgICAtLWs7CiAgfQp9CiAKdm9pZCBzb2x2ZSgpCnsKICBTQSgpOwogIExDUCgpOwogCiAgbG9uZyBsb25nIGludCBhbnMgPSBOOwogIGFucyA9IChhbnMqKGFucysxKSkvMjsKICBsb25nIGxvbmcgaW50IGsgPSAwOwogIGZvcihpbnQgaT0wO2k8TjtpKyspCiAgewogICAgays9bGNwW3Bvc1tpXV07CiAgfQogCiAgYW5zID0gYW5zIC0gazsKICBhbnMlPTEwMDAwMDAwMDk7CiAgLy9wcmludGYoIiVsbGRcbiIsYW5zKTsKIAp9CiAKIAppbnQgbWFpbigpCnsKICBpbnQgdCxuOwogIHNjYW5mKCIlZCIsICZ0KTsKICB3aGlsZSh0LS0pCiAgewogICAgaW50IHp6PTA7CgkKICAgIHNjYW5mKCIlcyIsJlMpOwogIG49c3RybGVuKFMpOwogICAgaWYobj09MSkKICAgIHsKICAgICAgcHJpbnRmKCIwXG4iKTsKICAgICAgY29udGludWU7CiAgICB9CiAKICAgIHNvbHZlKCk7CiAgICBmb3IoaW50IGk9MDtpPG47aSsrKQoJY291dDw8c2FbaV08PGVuZGw7CiAgfQogIHJldHVybiAwOwp9CiA=