There are n single boys and m single girls. Each of them may love none, one or several of other people unrequitedly and one-sidedly. For the coming q days, each night some of them will come together to hold a single party. In the party, if someone loves all the others, but is not loved by anyone, then he/she is called king/queen of unrequited love.
Input
There are multiple test cases. The first line of the input is an integer T ≈ 50 indicating the number of test cases.
Each test case starts with three positive integers no more than 30000
-- n m q
. Then each of the next n lines describes a boy, and each of the next m lines describes a girl. Each line consists of the name, the number of unrequitedly loved people, and the list of these people's names. Each of the last q lines describes a single party. It consists of the number of people who attend this party and their names. All people have different names whose lengths are no more than 20
. But there are no restrictions that all of them are heterosexuals.
Output
For each query, print the number of kings/queens of unrequited love, followed by their names in lexicographical order, separated by a space. Print an empty line after each test case. See sample for more details.
Sample Input
2 2 1 4 BoyA 1 GirlC BoyB 1 GirlC GirlC 1 BoyA 2 BoyA BoyB 2 BoyA GirlC 2 BoyB GirlC 3 BoyA BoyB GirlC 2 2 2 H 2 O S He 0 O 1 H S 1 H 3 H O S 4 H He O S
Sample Output
0 0 1 BoyB 0 00
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4704
#include<iostream> #include<algorithm> #include<string> #include<map> #include<set> #include<cmath> #include<string.h> #include<stdlib.h> #include<cstdio> #define ll long long using namespace std; int main(){ int t; cin>>t; while(t--){ set<string> x[30001]; //set的 .count用法,学习 map<string,int> id; //把每个人转换成数字下标i,对应x[i] string z[30001]; string h,w; int n,m,a,b; cin>>n>>m>>a; int p=-1; for(int i=0;i<n+m;++i){ cin>>h>>b; if(id.count(h)==0) id[h]=++p; for(int j=0;j<b;++j){ cin>>w; x[id[h]].insert(w);}} for(int i=0;i<a;++i){ cin>>b; for(int j=0;j<b;++j) cin>>z[j]; string g=z[0]; int flag=0; for(int j=1;j<b;++j){ if(!x[id[z[flag]]].count(z[j])||x[id[z[j]]].count(z[flag])){//如果没有进入这个if,那就说明z[flag]肯定满足,反过来即z[j]肯定不满足 g=z[j]; flag=j;}} //如果z[flag]不满足了,那就把flag换成j,再继续看z[flag']满不满足 for(int j=0;j<flag;++j){ if(!x[id[z[flag]]].count(z[j])||x[id[z[j]]].count(z[flag])){ //这一步是看z[flag]和它之前的值符不符合条件(因为上面都是往后符合的) g="0"; break;}} if(g=="0") cout<<0<<endl; else cout<<1<<" "<<g<<endl;} cout<<endl;} return 0; }