func_code_string: #include <bits/stdc++.h>   using namespace std;   #pragma warning(disable : 4996)   const int N = 2e5 + 5, L = 19;   string s;   int cl[L][N], sf[L][N], ct[N], pos[N], lcp[N], t[L][N], g[N];   pair<int, int> a[N + N];   int *suf = sf[L - 1];   int que(int l, int r) {     int k = g[r - l + 1];     return min(t[k][l], t[k][r - (1 << k) + 1]);   }   signed main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     for (int i = 2; i < N; i++) g[i] = g[i >> 1] + 1;     int n, q;     cin >> n >> q >> s;     s +=  # ;     n++;     for (int i = 0; i < n; i++) {       ct[s[i]]++;     }     for (int i = 0; i < N - 1; i++) {       ct[i + 1] += ct[i];     }     for (int i = n - 1; i >= 0; i--) {       sf[0][--ct[s[i]]] = i;       cl[0][i] = s[i];     }     for (int i = 1; i < L; i++) {       for (int j = 0; j < n; j++) {         sf[i - 1][j] = (sf[i - 1][j] - (1 << (i - 1)) % n + n) % n;       }       fill(ct, ct + N, 0);       for (int j = 0; j < n; j++) {         ct[cl[i - 1][sf[i - 1][j]]]++;       }       for (int j = 0; j < N - 1; j++) {         ct[j + 1] += ct[j];       }       for (int j = n - 1; j >= 0; j--) {         sf[i][--ct[cl[i - 1][sf[i - 1][j]]]] = sf[i - 1][j];       }       for (int j = 0, k = 0; j < n; j++) {         cl[i][sf[i][j]] = k;         if (j + 1 < n && (cl[i - 1][sf[i][j]] != cl[i - 1][sf[i][j + 1]] ||                           cl[i - 1][(sf[i][j] + (1 << (i - 1))) % n] !=                               cl[i - 1][(sf[i][j + 1] + (1 << (i - 1))) % n])) {           k++;         }       }     }     for (int i = 0; i < n; i++) {       pos[suf[i]] = i;     }     for (int i = 0, j = 0; i < n; i++) {       int p = pos[i];       if (p == n - 1) {         j = 0;         continue;       }       int q = suf[p + 1];       while (i + j < n && q + j < n && s[i + j] == s[q + j]) {         j++;       }       lcp[p] = j;       j = max(0, j - 1);     }     for (int i = 0; i < n; i++) {       t[0][i] = lcp[i];     }     for (int i = 1; i < L; i++) {       for (int j = 0; j + (1 << i) <= n; j++) {         t[i][j] = min(t[i - 1][j], t[i - 1][j + (1 << (i - 1))]);       }     }     for (int i = 0; i < q; i++) {       int la, lb, ls;       cin >> la >> lb;       ls = 0;       for (int j = 0; j < la; j++) {         cin >> a[ls].first;         a[ls].first--;         a[ls++].second = 1;       }       for (int j = 0; j < lb; j++) {         cin >> a[ls].first;         a[ls].first--;         a[ls++].second = 0;       }       sort(a, a + ls, [](pair<int, int> &x, pair<int, int> &y) {         if (pos[x.first] == pos[y.first]) return x.second < y.second;         return pos[x.first] < pos[y.first];       });       long long ans = 0;       for (int j = 0; j < ls - 1; j++) {         if (a[j].first == a[j + 1].first) ans += n - 1 - a[j].first;       }       vector<pair<int, int>> v;       v.push_back({-1, 0});       long long sum = 0;       for (int j = 1; j < ls; j++) {         if (a[j - 1].first != a[j].first) {           int h = que(pos[a[j - 1].first], pos[a[j].first] - 1),               x = a[j - 1].second;           while (v.back().first >= h) {             x += v.back().second;             sum -= v.back().first * (long long)v.back().second;             v.pop_back();           }           v.push_back({h, x});           sum += x * (long long)h;         }         if (!a[j].second) ans += sum;       }       for (int j = 0; j < ls - 1; j++) {         if (a[j].first == a[j + 1].first) swap(a[j], a[j + 1]);       }       v.clear();       v.push_back({-1, 0});       sum = 0;       for (int j = ls - 2; j >= 0; j--) {         if (a[j + 1].first != a[j].first) {           int h = que(pos[a[j].first], pos[a[j + 1].first] - 1),               x = a[j + 1].second;           while (v.back().first >= h) {             x += v.back().second;             sum -= v.back().first * (long long)v.back().second;             v.pop_back();           }           v.push_back({h, x});           sum += x * (long long)h;         }         if (!a[j].second) ans += sum;       }       cout << ans <<   n ;     }     return 0;   }   