Unrequited Love
Time Limit: 16 Seconds Memory Limit: 131072 KB 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 than20
. 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 SSample Output
0 0 1 BoyB 0 0 0
注意:①king如果有只有一个,因为出现king就表示着剩余的人不是喜欢全部的人;②先假定第一个人a满足条件,从第二个人开始遍历。若不满足条件,则把a置成b,而对于跳过的人,必定存在一个他不爱的人,这就是当时的a,不然,a就要等于他。所以最后对a进行判断即可,包括爱与被爱的关系。
#include<cstdio> #include<math.h> #include<cstring> #include<climits> #include<string> #include<queue> #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<climits> #include<string> #include<queue> #include<stack> #include<set> #include<map> #include<algorithm> using namespace std; #define rep(i,j,k)for(i=j;i<k;i++) #define per(i,j,k)for(i=j;i>k;i--) #define MS(x,y)memset(x,y,sizeof(x)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define ll long long #define abs(x) (x>0?x:-x) const int INF=0x7ffffff; const ll MAX=1e18; int main(){ int t; cin>>t; while(t--){ set<string> x[30001]; map<string,int> id; string z[30001]; string h,w; int n,m,a,b; int i,j,k; cin>>n>>m>>a; int p=-1; for(i=0;i<n+m;++i){ cin>>h>>b; //if(id.count(h)==0) id[h]=++p; for(j=0;j<b;++j){ cin>>w; x[id[h]].insert(w);}} for(i=0;i<a;++i){ cin>>b; for(j=0;j<b;++j)cin>>z[j]; string g=z[0]; int flag=0; for(j=1;j<b;++j){ if(!x[id[g]].count(z[j])||x[id[z[j]]].count(g)){ g=z[j]; flag=j;} } for(j=0;j<flag;++j){ if(!x[id[g]].count(z[j])||x[id[z[j]]].count(g)){ break; } } if(j!=flag) cout<<0<<endl; else cout<<1<<" "<<g<<endl;} cout<<endl; } return 0; }