func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MaxK = 53, MaxN = 2000005;   int N, K;   char A[MaxN];   char B[MaxN];   int id(char c) { return ( a  <= c && c <=  z ) ? c -  a  : c -  A  + 26; }   namespace KuhnMunkres {   const int MAX_N = 505;   const int INF = 100000000;   const int BASE = 1000;   int n;   int graph[MAX_N][MAX_N];   bool usedX[MAX_N];   bool usedY[MAX_N];   int linkTo[MAX_N];   int labelX[MAX_N];   int labelY[MAX_N];   bool findPath(int i) {     usedX[i] = true;     for (int j = 0; j < n; j++)       if (!usedY[j] && labelX[i] + labelY[j] == graph[i][j] && linkTo[j] == -1) {         usedY[j] = true;         linkTo[j] = i;         return true;       }     for (int j = 0; j < n; j++)       if (!usedY[j] && labelX[i] + labelY[j] == graph[i][j]) {         usedY[j] = true;         if (linkTo[j] == -1 || findPath(linkTo[j])) {           linkTo[j] = i;           return true;         }       }     return false;   }   int KuhnMunkres() {     memset(linkTo, -1, sizeof(linkTo));     memset(labelX, 0, sizeof(labelX));     memset(labelY, 0, sizeof(labelY));     for (int i = 0; i < n; i++)       for (int j = 0; j < n; j++) labelX[i] = max(labelX[i], graph[i][j]);     for (int k = 0; k < n; k++)       while (true) {         memset(usedX, 0, sizeof(usedX));         memset(usedY, 0, sizeof(usedY));         if (findPath(k)) break;         int delta = INF;         for (int i = 0; i < n; i++)           if (usedX[i])             for (int j = 0; j < n; j++)               if (!usedY[j])                 delta = min(delta, labelX[i] + labelY[j] - graph[i][j]);         if (delta == 0 || delta == INF) break;         for (int i = 0; i < n; i++)           if (usedX[i]) labelX[i] -= delta;         for (int i = 0; i < n; i++)           if (usedY[i]) labelY[i] += delta;       }     int maxTotal = 0;     for (int i = 0; i < n; i++) maxTotal += labelX[i] + labelY[i];     return maxTotal;   }   };  // namespace KuhnMunkres   int main() {     cin.sync_with_stdio(false);     cin >> N >> K;     cin >> A;     cin >> B;     KuhnMunkres::n = K;     for (int i = 0; i < N; i++) {       int u = id(A[i]);       int v = id(B[i]);       KuhnMunkres::graph[u][v]++;     }     cout << KuhnMunkres::KuhnMunkres() << endl;     int array[MaxK];     for (int i = 0; i < K; i++) {       array[KuhnMunkres::linkTo[i]] = i;     }     for (int i = 0; i < K; i++) {       int b = array[i];       if (b < 26)         cout << (char)( a  + b);       else         cout << (char)( A  + b - 26);     }     cout << endl;     return 0;   }   