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 0 0
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3601
ps:寒假集训训练赛的题目,百度翻译太可怕了,把“不保证每个人都是异性恋”翻译成了“保证每个人都是异性恋”,刚好没注意到这句话的英文,幸好方法里不涉及这一点,令人窒息,英语真是个让人头大的语言。
题意:给t组测试数据,每组第一行给出男生数量,女生数量,聚会次数,接下来每个男生一行,内容是男生名字,男生喜欢的人的个数,以及喜欢的人的名字(可能一个都不喜欢,可能喜欢好几个),女生亦是如此,之后每次聚会一行,内容是参加聚会人数,聚会人名。每次聚会,希望能找出一个倒霉蛋,要求这个人喜欢参加这次聚会的除ta自己以外的所有人,并且本次参加聚会的所有人都不喜欢ta,那么请输出这样的人的个数以及ta的名字。
思路:因为倒霉蛋要喜欢聚会里的所有人,并不被其他任何一个人喜欢,如果同一场聚会有第二个倒霉蛋,那么ta肯定是被第一个倒霉蛋喜欢的,这就和倒霉蛋的定义不符,因此,每一场要么有一个倒霉蛋,要么没有。因为题目有16000ms,所以我使用了暴力的双层循环,以每个人为假设的倒霉蛋,对聚会所有人遍历,如果有一个人喜欢ta,或者ta不喜欢某个人,那就对ta是倒霉蛋的假设进行否定。关于储存名字,用map构建了人名到这个人喜欢的人的名字的集合的映射。
↓
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
#include<map>
#include<vector>
#include<set>
using namespace std;
map<string,set<string> >mp;//人名到这个人喜欢的人的名字的集合的映射
char s[30030][111];//存每场聚会的人的名字
int main()
{
int t,n,m,q,num,p;
string a,b;
cin>>t;
while(t--)
{
mp.clear();
cin>>n>>m>>q;
for(int i=0;i<n;i++)
{
cin>>a>>num;
for(int j=0;j<num;j++)
{
cin>>b;
mp[a].insert(b);
}
}
for(int i=0;i<m;i++)
{
cin>>a>>num;
for(int j=0;j<num;j++)
{
cin>>b;
mp[a].insert(b);
}
}
set<string>::iterator it;
for(int i=0;i<q;i++)//暴力到窒息的双层循环
{
cin>>p;
for(int j=0;j<p;j++)
{
cin>>s[j];
}
string ans;
int bigflag=0;
for(int j=0;j<p;j++)
{
int flag=0;
for(int k=0;k<p;k++)
{
if(mp[s[j]].count(s[k])==0&&j!=k)//如果ta不喜欢聚会的某个人,说明ta不是倒霉蛋
{
flag=1;
break;
}
if(mp[s[k]].count(s[j])==1)//如果有个人喜欢ta,说明ta不是倒霉蛋
{
flag=1;
break;
}
}
if(flag==0)//有倒霉蛋找到了,不用找了
{
bigflag=1;
flag=1;
ans=s[j];
break;
}
}
if(bigflag==0)//没有倒霉蛋
{
cout<<0<<endl;
}
else
{
cout<<1<<" "<<ans<<endl;
}
}
puts("");//别忘了,不然会PE
}
return 0;
}