func_code_string: #include <bits/stdc++.h>   #pragma GCC optimize( O2 )   #pragma GCC optimize( Ofast )   #pragma GCC optimize( O3 )   using namespace std;   const int N = 1e6 + 5;   int n, p = 1, pa[N];   int ch[N][26];   vector<int> cnt[N][2];   vector<pair<int, int> > as;   long long ans;   inline void dfs(int u, int dep) {     for (register int i = 0; i <= 25; ++i) {       int v = ch[u][i];       if (v) {         dfs(v, dep + 1);         for (register int j = 0; j < cnt[v][0].size(); ++j)           cnt[u][0].push_back(cnt[v][0][j]);         for (register int j = 0; j < cnt[v][1].size(); ++j)           cnt[u][1].push_back(cnt[v][1][j]);       }     }     ans += min(cnt[u][0].size(), cnt[u][1].size()) * dep;     for (register int i = min(cnt[u][0].size(), cnt[u][1].size()) - 1; i > -1;          --i) {       as.push_back(           {cnt[u][0][cnt[u][0].size() - 1], cnt[u][1][cnt[u][1].size() - 1]});       cnt[u][0].pop_back();       cnt[u][1].pop_back();     }   }   string a;   int main() {     cin >> n;     for (register int id = 1; id <= n; ++id) {       cin >> a;       int u = 1;       for (register int i = 0; i < a.size(); ++i) {         int c = a[i] -  a ;         if (ch[u][c] == 0) ch[u][c] = ++p;         u = ch[u][c];       }       cnt[u][0].push_back(id);     }     for (register int id = 1; id <= n; ++id) {       cin >> a;       int u = 1;       for (int i = 0; i < a.size(); ++i) {         int c = a[i] -  a ;         if (!ch[u][c]) ch[u][c] = ++p;         u = ch[u][c];       }       cnt[u][1].push_back(id);     }     dfs(1, 0);     printf( %d n , ans);     for (register int i = 0; i <= n - 1; ++i)       printf( %d %d n , as[i].first, as[i].second);     return 0;   }   