ZOJ3960 What Kind of Friends Are You? 题解

What Kind of Friends Are You?

Time Limit: 1 Second       Memory Limit: 65536 KB

Japari Park is a large zoo home to extant species, endangered species, extinct species, cryptids and some legendary creatures. Due to a mysterious substance known as Sandstar, all the animals have become anthropomorphized into girls known as Friends.

Kaban is a young girl who finds herself in Japari Park with no memory of who she was or where she came from. Shy yet resourceful, she travels through Japari Park along with Serval to find out her identity while encountering more Friends along the way, and eventually discovers that she is a human.

However, Kaban soon finds that it's also important to identify other Friends. Her friend, Serval, enlightens Kaban that she can use some questions whose expected answers are either "yes" or "no" to identitfy a kind of Friends.

To be more specific, there are n Friends need to be identified. Kaban will ask each of them q same questions and collect their answers. For each question, she also gets a full list of animals' names that will give a "yes" answer to that question (and those animals who are not in the list will give a "no" answer to that question), so it's possible to determine the name of a Friends by combining the answers and the lists together.

But the work is too heavy for Kaban. Can you help her to finish it?

Input

There are multiple test cases. The first line of the input is an integer T (1 ≤ T ≤ 100), indicating the number of test cases. Then T test cases follow.

The first line of each test case contains two integers n (1 ≤ n ≤ 100) and q (1 ≤ q ≤ 21), indicating the number of Friends need to be identified and the number of questions.

The next line contains an integer c (1 ≤ c ≤ 200) followed by c strings p1p2, ... , pc (1 ≤ |pi| ≤ 20), indicating all known names of Friends.

For the next q lines, the i-th line contains an integer mi (0 ≤ mi ≤ c) followed by mi strings si, 1si, 2, ... , simi (1 ≤ |sij| ≤ 20), indicating the number of Friends and their names, who will give a "yes" answer to the i-th question. It's guaranteed that all the names appear in the known names of Friends.

For the following n lines, the i-th line contains q integers ai, 1ai, 2, ... , aiq (0 ≤ aij ≤ 1), indicating the answer (0 means "no", and 1 means "yes") to the j-th question given by the i-th Friends need to be identified.

It's guaranteed that all the names in the input consist of only uppercase and lowercase English letters.

Output

For each test case output n lines. If Kaban can determine the name of the i-th Friends need to be identified, print the name on the i-th line. Otherwise, print "Let's go to the library!!" (without quotes) on the i-th line instead.

Sample Input

2
3 4
5 Serval Raccoon Fennec Alpaca Moose
4 Serval Raccoon Alpaca Moose
1 Serval
1 Fennec
1 Serval
1 1 0 1
0 0 0 0
1 0 0 0
5 5
11 A B C D E F G H I J K
3 A B K
4 A B D E
5 A B K D E
10 A B K D E F G H I J
4 B D E K
0 0 1 1 1
1 0 1 0 1
1 1 1 1 1
0 0 1 0 1
1 0 1 1 1

Sample Output

Serval
Let's go to the library!!
Let's go to the library!!
Let's go to the library!!
Let's go to the library!!
B
Let's go to the library!!
K

Hint

The explanation for the first sample test case is given as follows:

As Serval is the only known animal who gives a "yes" answer to the 1st, 2nd and 4th question, and gives a "no" answer to the 3rd question, we output "Serval" (without quotes) on the first line.

As no animal is known to give a "no" answer to all the questions, we output "Let's go to the library!!" (without quotes) on the second line.

Both Alpaca and Moose give a "yes" answer to the 1st question, and a "no" answer to the 2nd, 3rd and 4th question. So we can't determine the name of the third Friends need to be identified, and output "Let's go to the library!!" (without quotes) on the third line.


Author:  DAI, Longao
Source:  The 14th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple
Submit     Status

题目大意:

这道题主要意思是你有n个朋友,你现在要分辨出他们,因此你提问了q个问题,你知道每个人能否回答每个问题,现在告诉你一个人能够回答出的问题列表,问你能否确定是哪个朋友。

这道题目的关键是要匹配问题的列表,但问题较多如果一个一个匹配可能会超时,因为问题只有不到20个,因此我们可以对每个人能回答出的问题编号,这个编号可以用二进制 每一位于能否回答问题对应产生,例如:Bob能回答的问题列表为1,0,0,1,1(共五个题目),则其编号是二进制数10011(2)即19;这样编号后只需要查找编号即可判断所有问题是否匹配,题目就变成了根据一组能否回答问题的列表转化为编号,查找此编号是否有唯一的人与之对应。查找编号时可以使用二分法查找,鉴于本题数据量不大,可以直接暴力查找。

代码如下:

#include<bits/stdc++.h>
using namespace std;
string s[210];
map<string ,int> sid;
int a[30][210];
int b[30];
struct cc
{
	int id;
	int val;
}c[210];
bool cmp(cc a,cc b)
{
	return a.val<b.val;
}

int main()
{
	int T;
	int n,q,sn,m;
	int i,j;
	cin>>T;
	while(T--)
	{
		cin>>n>>q;
		cin>>sn;
		sid.clear();
		for(i=0;i<sn;i++)
		{
			cin>>s[i];
			sid[s[i]]=i;
		}
		memset(a,0,sizeof(a));
		for(i=0;i<q;i++)
		{
			cin>>m;
			string s0;
			for(j=0;j<m;j++)
			{
				cin>>s0;
				a[i][sid[s0]]=1;
			}
		}
		int tmp;
		for(i=0;i<sn;i++)
		{
			tmp=0;
			for(j=0;j<q;j++)
			{
				tmp=tmp<<1;
				tmp+=a[j][i];
			}
			c[i].id=i;
			c[i].val=tmp;
		}
		sort(c,&c[sn],cmp);
		
		for(i=0;i<n;i++)
		{
			tmp=0;
			int a0;
			for(j=0;j<q;j++)
			{
				cin>>a0;
				tmp=tmp<<1;
				tmp+=a0;
			}
			for(j=0;j<sn;j++)
			{
				if(tmp==c[j].val)
				{
					break;
				}
			}
			if(j==sn)
			{
				cout<<"Let's go to the library!!"<<endl;
				continue;
			}
			if(j==sn-1)
			{
				cout<<s[c[j].id]<<endl;
				continue;
			}
			if(tmp!=c[j+1].val)
			{
				cout<<s[c[j].id]<<endl;
				continue;
			}
			else
			{
				cout<<"Let's go to the library!!"<<endl;
				continue;
			}
		}
	}
	return 0;
}


猜你喜欢

转载自blog.csdn.net/Outp0st/article/details/80288640