func_code_string: #include <bits/stdc++.h>   using namespace std;   char s[1005][11][11];   int d[1005][1005], vis[1005], fa[1005], t[1005][2];   int n, m, c;   vector<int> V[1005];   struct Edge {     int a, b, w;   } p[500005];   int cmp(Edge x, Edge y) { return x.w < y.w; }   int cal(int a, int b) {     int ans = 0, i, j;     for (i = 0; i < n; i++)       for (j = 0; j < m; j++)         if (s[a][i][j] != s[b][i][j]) ans++;     return ans;   }   int find(int x) {     if (x != fa[x]) return fa[x] = find(fa[x]);     return x;   }   void dfs(int u, int pu) {     int x, i;     vis[u] = 1;     t[c][0] = u, t[c++][1] = pu;     for (i = 0; i < V[u].size(); i++) {       x = V[u][i];       if (vis[x]) continue;       dfs(x, u);     }   }   int main() {     int k, w, i, j;     scanf( %d%d%d%d , &n, &m, &k, &w);     for (i = 1; i <= k; i++) {       for (j = 0; j < n; j++) scanf( %s , s[i][j]);     }     c = 0;     for (i = 1; i <= k; i++)       for (j = i + 1; j <= k; j++) {         int dis = cal(i, j);         if (dis * w <= n * m) {           p[c].a = i;           p[c].b = j;           p[c++].w = dis * w;         }       }     sort(p, p + c, cmp);     for (i = 1; i <= k; i++) fa[i] = i;     int ans = 0;     for (i = 0; i < c; i++) {       int fx = find(p[i].a);       int fy = find(p[i].b);       if (fx == fy) continue;       fa[fx] = fy;       ans += p[i].w;       V[p[i].a].push_back(p[i].b);       V[p[i].b].push_back(p[i].a);     }     c = 0;     for (i = 1; i <= k; i++)       if (!vis[i]) {         ans += n * m;         dfs(i, 0);       }     printf( %d n , ans);     for (i = 0; i < c; i++) printf( %d %d n , t[i][0], t[i][1]);   }   