#include #include #include #include #include #include #include using namespace std; typedef map STRING2MAP; int main() { int n, m; int i, j; int k; char name[25], like[25], hate[25], go[25]; map t_map; map::iterator it_t; map t_now; map::iterator it_n; STRING2MAP::iterator it_f; STRING2MAP S2M; string t_add[101], t_remove[101]; int p_add, p_remove; int h, l; int geted; while (scanf("%d%d", &n, &m) != EOF) { t_map.clear(); t_now.clear(); for (i=0; i < n; i++) { scanf("%s", name); scanf("%d", &k); t_map[name] = S2M; it_t = t_map.find(name); for (j=0; j < k; j++) { scanf("%s", like); it_t->second.insert(STRING2MAP::value_type(like, 1)); } scanf("%d", &k); for (j=0; j < k; j++) { scanf("%s", hate); it_t->second.insert(STRING2MAP::value_type(hate, 2)); } } scanf("%d", &k); for (j=0; j < k; j++) { scanf("%s", go); t_now[go] = true; } for (i=0; isecond.find(it_n->first); if (it_f != it_t->second.end()) { geted = it_f->second; if (geted & 1) l++; if (geted & 1<<1) h++; if (l>0 && h>0) break; } } if (h == 0 && l > 0) t_add[p_add++] = it_t->first; if (h > 0 && l == 0) t_remove[p_remove++] = it_t->first; } if (p_remove == 0 && p_add == 0) break; for (j=0; j < p_remove; j++) t_now.erase(t_remove[j]); for (j=0; j first; it_n++; for (; it_n != t_now.end(); it_n++) cout << " " << it_n->first; cout << endl; } return 0; }