#include #include #include #include #include using namespace std; const int N = 1e5 + 100; const int INF = 0x3f3f3f3f; char st[10]; int dp[2][1500]; int mp[1500][1500], s[1500]; int cnt[15]; int check(int x, int y){ for (int i = 0; i < 10; i ++) if ((x & (1 << i)) && ((y & (1 << i)) == 0)) return 0; return 1; } int main(){ int T; cin >> T; // cout << check(1, 0) << endl; for (int i = 0; i < (1 << 10); i ++) for (int j = 0; j < (1 << 10); j ++){ mp[i][j] = check(i, j); } while (T --){ int n; cin >> n; int sum = 0; for (int i = 0; i < 10; i ++) cnt[i] = 0; for (int i = 1; i <= n; i ++){ scanf("%s", st); int x = st[4] - '0'; cnt[x] ++; sum ++; } for (int i = 0; i < (1 << 10); i ++){ s[i] = sum; for (int j = 0; j < 10; j ++) if (i & (1 << j)) s[i] -= cnt[j]; } int cur = 0; memset(dp, 0x3f, sizeof(dp)); dp[0][0] = 0; for (int i = 1; i <= 5; i ++){ for (int j = 0; j < (1 << 10); j ++) dp[cur ^ 1][j] = INF; for (int j = 0; j < (1 << 10); j ++){ for (int k = 0; k < (1 << 10); k ++) if (mp[j][k]){ int sta = j ^ k; // if (j == 0 && k == 0) // printf("(%d,%d) ",dp[cur ^ 1][k], max(dp[cur][j], s[sta])); dp[cur ^ 1][k] = min(dp[cur ^ 1][k], max(dp[cur][j], s[sta])); } } // for (int j = 0; j < (1 << 10); j ++) printf("%d ", dp[cur ^ 1][j]); cout << endl; cur ^= 1; } int ans = sum; for (int i = 0; i < (1 << 10); i ++) ans = min(ans, dp[cur][i]); cout << ans << endl; } }