#include using namespace std; typedef long long ll; typedef pair pii; typedef pair pil; typedef pair pli; typedef pairpll; const ll MOD = 1e9 + 7; const int MAXN = 1e5; ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); } ll lcm(ll a, ll b) { return a / gcd(a, b) * b; } ll pow(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = res * a % MOD; a = a * a % MOD; b >>= 1; } return res; } struct unionset { int size; int fa[30000]; void clear(int jj) { for (int i = 0; i <= jj; i++) { fa[i] = i; } } int getfa(int x) { return fa[x] == x ? x : fa[x] = getfa(fa[x]); } bool merge(int a, int b) { int faa = getfa(a); int fbb = getfa(b); if (faa > fbb)swap(faa, fbb); if (faa != fbb) { fa[fbb] = faa; return true; } return false; } }; struct graph { struct edge { int v, nxt; int d; edge(int vv = 0, int dd = 0, int nn = 0) { v = vv; d = dd; nxt = nn; } }; static const int MAXN = 1e5; static const int MAXM = 1e6; vectorh; vectore; graph() { h.clear(); e.clear(); for (int i = 0; i < MAXN; i++) { h.push_back(-1); } } void addedge(int u, int v, int d = 0) { e.push_back(edge()); e[e.size() - 1].v = v; e[e.size() - 1].d = d; e[e.size() - 1].nxt = h[u]; h[u] = e.size() - 1; } }; int dp[10][(1 << 12)]; int ct[(1 << 12)]; int car[11]; char s[100]; int main() { int T; cin >> T; while (T--) { memset(car, 0, sizeof car); memset(dp, -1, sizeof dp); memset(ct, 0, sizeof ct); int n; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%s", s); car[s[4] - '0']++; } for (int i = 0; i < (1 << 10); i++) { int now = 0; for (int j = 0; j < 10; j++) { if ((i & (1 << j)) != 0) { now += car[j]; } } ct[i] = now; } for (int i = 0; i < (1 << 10); i++) { dp[0][i] = n - ct[i]; } for (int i = 1; i < 5; i++) { for (int j = 0; j < (1 << 10); j++) { for (int k = 0; k < (1 << 10); k++) { if (j & k)continue; if (dp[i][j | k] == -1)dp[i][j | k] = max(dp[i - 1][k], n - ct[j]); else dp[i][j | k] = min(dp[i][j | k], max(dp[i - 1][k], n - ct[j])); } } } int ans = 1e9; for (int i = 0; i < (1 << 10); i++) { ans = min(ans, dp[4][i]); } printf("%d\n", ans); } }