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 = (int)5e5 + 7;
const int MAXV = 2 * MAXN;
map<char, int> to[MAXV];
vector<int> guys[MAXN];
int len[MAXV], link[MAXV];
long long cnt[MAXV];
int sz = 1, last;
void init() {
  for (int i = 0; i < MAXV; i++) {
    to[i].clear();
    guys[i].clear();
    len[i] = link[i] = cnt[i] = 0;
  }
  link[0] = -1;
  len[0] = 0;
  last = 0;
  sz = 1;
}
void add_char(char c) {
  int cur = sz++;
  int p = last;
  len[cur] = len[p] + 1;
  while (p != -1 && !to[p].count(c)) {
    to[p][c] = cur;
    p = link[p];
  }
  if (p == -1) {
    link[cur] = 0;
  } else {
    int q = to[p][c];
    if (len[q] == len[p] + 1) {
      link[cur] = q;
    } else {
      int suf = sz++;
      link[suf] = link[q];
      to[suf] = to[q];
      len[suf] = len[p] + 1;
      while (p != -1 && to[p][c] == q) {
        to[p][c] = suf;
        p = link[p];
      }
      link[cur] = link[q] = suf;
    }
  }
  last = cur;
}
int main() {
  ios_base::sync_with_stdio(0);
  int n;
  cin >> n;
  while (n--) {
    int mx = 0;
    init();
    string s;
    cin >> s;
    for (char c : s) {
      add_char(c);
      cnt[last]++;
    }
    for (int i = 1; i < sz; i++) {
      guys[len[i]].push_back(i);
      mx = max(mx, len[i]);
    }
    long long ans = 0;
    for (int go = mx; go >= 0; go--) {
      for (auto p : guys[go]) {
        cnt[link[p]] += cnt[p];
        ans += cnt[p] * (long long)cnt[p] * (long long)(len[p] - len[link[p]]);
      }
    }
    cout << ans << '\n';
  }
}