func_code_string: #include <bits/stdc++.h>   using namespace std;   int t, n, m, cur;   int nxt[200200][26], link[200200], dp[200200], cnt[200200], ord[200200],       occur[200200];   char s[200200];   void extend(int c) {     int x = cur, y = cur = ++m;     dp[y] = dp[x] + 1;     occur[y] = 1;     while (x && !nxt[x][c]) nxt[x][c] = y, x = link[x];     if (!x)       link[y] = 1;     else {       int z = nxt[x][c];       if (dp[z] == dp[x] + 1)         link[y] = z;       else {         int u = ++m;         memcpy(nxt[u], nxt[z], sizeof nxt[u]);         link[u] = link[z], link[z] = link[y] = u;         dp[u] = dp[x] + 1;         while (x && nxt[x][c] == z) nxt[x][c] = u, x = link[x];       }     }   }   void build(char *s) {     memset(nxt, 0, sizeof nxt), memset(link, 0, sizeof link),         memset(dp, 0, sizeof dp);     n = strlen(s), m = 0;     cur = ++m;     for (int i = 0; i < n; i++) extend(s[i] -  a );     memset(cnt, 0, sizeof cnt);     for (int i = 1; i <= m; i++) cnt[dp[i]]++;     for (int i = 1; i <= n; i++) cnt[i] += cnt[i - 1];     for (int i = m; i >= 1; i--) ord[cnt[dp[i]]--] = i;   }   int main() {     scanf( %d , &t);     while (t--) {       scanf( %s , s);       memset(occur, 0, sizeof occur);       build(s);       for (int i = m; i >= 1; i--) occur[link[ord[i]]] += occur[ord[i]];       long long ans = 0;       for (int i = 1; i <= m; i++)         ans += 1ll * occur[i] * occur[i] * (dp[i] - dp[link[i]]);       printf( %I64d n , ans);     }     return 0;   }   