func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 400000 + 10;   const int M = 26;   namespace Trie {   int trie[N][M], cnt[N], size;   void init() {     size = 0;     memset(trie[0], 0, sizeof(trie[0]));     cnt[0] = 0;   }   void insert(char str[]) {     int u = 0, v;     for (int i = 0; str[i]; i++) {       v = str[i] -  a ;       if (!trie[u][v]) {         trie[u][v] = ++size;         cnt[size] = 0;         memset(trie[size], 0, sizeof(trie[size]));       }       u = trie[u][v];     }     cnt[u]++;   }   }  // namespace Trie   namespace SAM {   struct state {     int len, link, siz;     int next[M];   } st[N];   int sz, last;   void init() {     sz = 1, last = 0;     st[0].len = 0;     st[0].link = -1;   }   void add(int c) {     int r = sz++;     st[r].len = st[last].len + 1;     st[r].siz = 1;     int p = last;     while (p != -1 && !st[p].next[c]) st[p].next[c] = r, p = st[p].link;     if (p == -1)       st[r].link = 0;     else {       int q = st[p].next[c];       if (st[q].len == st[p].len + 1)         st[r].link = q;       else {         int qq = sz++;         st[qq].link = st[q].link;         memcpy(st[qq].next, st[q].next, sizeof(st[q].next));         st[qq].len = st[p].len + 1;         st[qq].siz = 0;         while (p != -1 && st[p].next[c] == q) st[p].next[c] = qq, p = st[p].link;         st[q].link = st[r].link = qq;       }     }     last = r;   }   int tp[N], tmp[N];   void get_topo() {     memset(tmp, 0, sizeof(tmp));     for (int i = 0; i < sz; i++) tmp[st[i].len]++;     for (int i = 1; i < sz; i++) tmp[i] += tmp[i - 1];     for (int i = 0; i < sz; i++) tp[--tmp[st[i].len]] = i;   }   void calc_siz() {     get_topo();     for (int i = sz - 1; i > 0; i--) st[st[tp[i]].link].siz += st[tp[i]].siz;     st[0].siz = 0;   }   }  // namespace SAM   long long dfs(int tu, int su) {     long long ans = 1ll * Trie::cnt[tu] * SAM::st[su].siz;     for (int i = 0; i < M; i++) {       int tv = Trie::trie[tu][i];       int sv = SAM::st[su].next[i];       if (tv == 0 || sv == 0) continue;       ans += dfs(tv, sv);     }     return ans;   }   int id[N];   void ddfs(int i) {     if (id[i] == -1) return;     for (int j = 0; j < M; j++) {       int v = Trie::trie[i][j];       if (v) {         id[v] = SAM::st[id[i]].next[j];         if (id[v] == 0) id[v]--;         ddfs(v);       }     }   }   char s[N];   int main() {     SAM::init(), Trie::init();     scanf( %s , s);     for (int i = 0; s[i]; i++) SAM::add(s[i] -  a );     SAM::calc_siz();     int n;     scanf( %d , &n);     for (int i = 0; i < n; i++) {       scanf( %s , s);       Trie::insert(s);     }     ddfs(0);     long long ans = 0;     for (int i = 0; i <= Trie::size; i++) {       if (id[i] <= 0) continue;       if (Trie::cnt[i]) ans += 1ll * Trie::cnt[i] * dfs(0, id[i]);     }     printf( %lld n , ans);   }   