func_code_string: #include <bits/stdc++.h>   const int bufSize = 1e6;   using namespace std;   inline char nc() {     return getchar();     static char buf[bufSize], *p1 = buf, *p2 = buf;     return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, bufSize, stdin), p1 == p2)                ? EOF                : *p1++;   }   inline void read(char* s) {     static char c;     for (; !isalpha(c); c = nc())       ;     for (; isalpha(c); c = nc()) *s++ = c;     *s =   0 ;   }   template <typename T>   inline T read(T& r) {     static char c;     static int flag;     flag = 1, r = 0;     for (c = nc(); !isdigit(c); c = nc())       if (c ==  - ) flag = -1;     for (; isdigit(c); c = nc()) r = r * 10 + c - 48;     return r *= flag;   }   const int maxn = 1e5 + 100;   const int maxm = 22;   int T, n;   char A[maxn], B[maxn];   int G[maxm][maxm];   int G2[maxm];   vector<int> s[maxm];   int fa[maxm];   int find(const int& x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }   inline void merge(int x, int y) {     x = find(x), y = find(y);     if (x == y) return;     if (s[x].size() < s[y].size()) swap(x, y);     fa[y] = x;     for (vector<int>::iterator it = s[y].begin(); it != s[y].end(); ++it)       s[x].push_back(*it);     s[y].clear();   }   int f[1 << 21], num[1 << 21];   inline void init() {     for (int i = 1; i <= 20; ++i) fa[i] = i, s[i].clear(), s[i].push_back(i);     for (int i = 1; i <= 20; ++i)       for (int j = 1; j <= 20; ++j) G[i][j] = 0;   }   int main() {     for (int i = 0; i < (1 << 20); ++i)       for (int x = i; x; x >>= 1) num[i] += (x & 1);     read(T);     while (T--) {       read(n);       read(A + 1), read(B + 1);       init();       for (int i = 1; i <= n; ++i) {         if (A[i] == B[i]) continue;         G[A[i] -  a  + 1][B[i] -  a  + 1] = 1;         merge(A[i] -  a  + 1, B[i] -  a  + 1);       }       int ans = 0;       for (int i = 1; i <= 20; ++i) {         if (find(i) != i) continue;         for (unsigned int j = 0; j < s[i].size(); ++j) G2[j] = 0;         for (unsigned int j = 0; j < s[i].size(); ++j)           for (unsigned int k = 0; k < s[i].size(); ++k)             if (G[s[i][j]][s[i][k]]) G2[j] |= (1 << k);         int maxx = (1 << (int)s[i].size());         for (int status = 0; status < maxx; ++status) f[status] = 0;         f[0] = 1;         int res = 0;         for (int status = 0; status < maxx; ++status) {           if (!f[status]) continue;           res = max(res, num[status]);           for (unsigned int j = 0; j < s[i].size(); ++j)             if (!(status & (1 << j)) && !(G2[j] & status))               f[status | (1 << j)] = 1;         }         ans += 2 * s[i].size() - res - 1;       }       printf( %d n , ans);     }     return 0;   }   