#include #include #include using namespace std; struct pupil_t { int height; char sex; string music, sport; int label; }; bool adjacent[501][501]; // adjacent[i][j] == true; if male[i] matches female[j] vector male, female; bool match(const pupil_t &p1, const pupil_t &p2) { return (abs(p1.height - p2.height) <= 40 && p1.sex != p2.sex && p1.music == p2.music && p1.sport != p2.sport); } bool recursive(int fi, bool visited[501]) { for (int mi = 0; mi < male.size(); mi++) { if (!visited[mi] && adjacent[mi][fi]) { visited[mi] = true; if (male[mi].label < 0 || recursive(male[mi].label, visited)) { male[mi].label = fi; female[fi].label = mi; return true; } } } return false; } int main() { int T; cin >> T; for (int I = 0; I < T; I++) { int N, n_match = 0; cin >> N; male.clear(); female.clear(); for (int i = 0; i < N; i++) { pupil_t p; cin >> p.height >> p.sex >> p.music >> p.sport; p.label = -1; if (p.sex == 'M') { male.push_back(p); } else { female.push_back(p); } } for (int mi = 0; mi < male.size(); mi++) { for (int fi = 0; fi < female.size(); fi++) { adjacent[mi][fi] = match(male[mi], female[fi]); if (adjacent[mi][fi] && male[mi].label < 0 && female[fi].label < 0) { n_match++; male[mi].label = fi; female[fi].label = mi; } } } for (int fi = 0; fi < female.size(); fi++) { if (female[fi].label < 0) { bool visited[501]; for (int i = 0; i < 501; i++) { visited[i] = false; } if (recursive(fi, visited)) { n_match++; } } } cout << (N - n_match) << endl; } return 0; }