Problem: Now that you have proposed a fake post for the HC2 Facebook page, Heidi wants to measure the quality of the post before actually posting it. She recently came across a (possibly fake) article about the impact of fractal structure on multimedia messages and she is now trying to measure the self-similarity of the message, which is defined as

<image>

where the sum is over all nonempty strings p and <image> is the number of occurences of p in s as a substring. (Note that the sum is infinite, but it only has a finite number of nonzero summands.)

Heidi refuses to do anything else until she knows how to calculate this self-similarity. Could you please help her? (If you would like to instead convince Heidi that a finite string cannot be a fractal anyway – do not bother, we have already tried.)

Input

The input starts with a line indicating the number of test cases T (1 ≤ T ≤ 10). After that, T test cases follow, each of which consists of one line containing a string s (1 ≤ |s| ≤ 100 000) composed of lowercase letters (a-z).

Output

Output T lines, every line containing one number – the answer to the corresponding test case.

Example

Input

4
aa
abcd
ccc
abcc


Output

5
10
14
12

Note

A string s contains another string p as a substring if p is a contiguous subsequence of s. For example, ab is a substring of cab but not of acb.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
string s;
long long pos[MAXN], tmp[MAXN], sa[MAXN], lcp[MAXN], parr[MAXN], parl[MAXN],
    gapSA, n;
bool SufCmp(long long fr, long long sd) {
  if (pos[fr] != pos[sd]) return pos[fr] < pos[sd];
  return (fr + gapSA < n && sd + gapSA < n) ? pos[fr + gapSA] < pos[sd + gapSA]
                                            : fr > sd;
}
void BuildLCP() {
  long long k = 0;
  for (long long i = 0; i < n; i++) {
    if (pos[i] != n - 1) {
      for (long long j = sa[pos[i] + 1]; s[i + k] == s[j + k];) k++;
      lcp[pos[i]] = k;
      if (k) k--;
    }
  }
}
void Solve() {
  n = s.size();
  for (long long i = 0; i < n; i++) sa[i] = i, pos[i] = (long long)s[i] - 'a';
  for (gapSA = 1; gapSA <= 2 * n; gapSA *= 2) {
    sort(sa, sa + n, SufCmp);
    tmp[0] = 0;
    for (long long i = 1; i < n; i++)
      tmp[i] = tmp[i - 1] + (long long)SufCmp(sa[i - 1], sa[i]);
    for (long long i = 0; i < n; i++) pos[sa[i]] = tmp[i];
  }
  BuildLCP();
  for (long long i = 0; i < n - 1; i++) {
    parl[i] = i - 1;
    while (parl[i] != -1 && lcp[parl[i]] > lcp[i]) parl[i] = parl[parl[i]];
  }
  for (long long i = n - 2; i >= 0; i--) {
    parr[i] = i + 1;
    while (parr[i] != n - 1 && lcp[parr[i]] >= lcp[i]) parr[i] = parr[parr[i]];
  }
  long long ans = 0;
  for (long long i = 0; i < n - 1; i++) {
    ans += (parr[i] - i) * (i - parl[i]) * lcp[i];
  }
  cout << ans * 2 + n * (n + 1) / 2 << "\n";
}
void reset() {
  for (long long i = 0; i < n + 1; i++)
    lcp[i] = sa[i] = parr[i] = parl[i] = pos[i] = 0;
  return;
}
int32_t main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  long long t;
  cin >> t;
  while (t--) {
    cin >> s;
    Solve();
    reset();
  }
  return 0;
}