func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 8e5 + 5, B = 20;   char s[N];   int n, fa[N], len[N], sz[N], a[N], cc[N], np = 1, cnt = 1;   map<int, int> c[N];   int poi[N];   vector<int> e[N];   int st[B][N << 1], dfn[N], pos[N], tim;   int qq[N << 1], pre[N], za[N], zb[N], siz;   bool cmp(int a, int b) { return dfn[a] < dfn[b]; }   void dfs(int u) {     dfn[u] = ++tim;     pos[tim] = u;     st[0][tim] = dfn[u];     for (auto v : e[u]) dfs(v), st[0][++tim] = dfn[u];   }   void bui_st() {     for (int i = 1; i <= B - 1; ++i)       for (int j = 1; j + (1 << i) - 1 <= tim; ++j)         st[i][j] = min(st[i - 1][j], st[i - 1][j + (1 << i - 1)]);   }   int lca(int a, int b) {     if ((a = dfn[a]) > (b = dfn[b])) swap(a, b);     int d = floor(log2(b - a + 1));     return pos[min(st[d][a], st[d][b - (1 << d) + 1])];   }   void append(int x) {     int p = np;     np = ++cnt;     len[np] = len[p] + 1;     sz[np] = 1;     for (; p && !c[p][x]; p = fa[p]) c[p][x] = np;     if (!p)       fa[np] = 1;     else {       int q = c[p][x];       if (len[q] == len[p] + 1)         fa[np] = q;       else {         int nq = ++cnt;         len[nq] = len[p] + 1;         c[nq] = c[q];         fa[nq] = fa[q];         fa[q] = fa[np] = nq;         for (; c[p][x] == q; p = fa[p]) c[p][x] = nq;       }     }   }   void get_edge() {     for (int i = 1; i <= cnt; ++i) e[fa[i]].push_back(i);   }   void ini2() {     while (siz) za[qq[siz]] = zb[qq[siz]] = 0, --siz;     int la, lb, x;     scanf( %d%d , &la, &lb);     for (int i = 1; i <= la; ++i)       scanf( %d , &x), ++za[qq[++siz] = poi[n + 1 - x]];     for (int i = 1; i <= lb; ++i)       scanf( %d , &x), ++zb[qq[++siz] = poi[n + 1 - x]];     sort(qq + 1, qq + siz + 1, cmp);     for (int i = siz; i >= 2; --i) qq[++siz] = lca(qq[i], qq[i - 1]);     sort(qq + 1, qq + siz + 1, cmp);     siz = unique(qq + 1, qq + siz + 1) - qq - 1;     stack<int> Q;     Q.push(qq[1]);     pre[qq[1]] = 0;     for (int i = 2; i <= siz; ++i) {       for (int t; t = Q.top(), lca(t, qq[i]) != t;) Q.pop();       pre[qq[i]] = Q.top();       Q.push(qq[i]);     }   }   long long solve() {     long long re = 0;     for (int i = siz; i >= 1; --i) {       int x = qq[i];       re += 1ll * za[x] * zb[x] * (len[x] - len[pre[x]]);       za[pre[x]] += za[x];       zb[pre[x]] += zb[x];     }     return re;   }   int main() {     int q;     scanf( %d%d%s , &n, &q, s + 1);     reverse(s + 1, s + n + 1);     for (int i = 1; i <= n; ++i) append(s[i] -  a ), poi[i] = np;     get_edge();     dfs(1);     bui_st();     while (q--) {       ini2();       printf( %lld n , solve());     }   }   