题目描述
X 国的情报委员受到一份可靠的消息,信息表明 Y 国将派espionage去窃取 X 国的机密文件。X 国指挥官手中有两份名单列表,一份是 Y 国派往 X 国的espionage名单列表,另一份是 X 国以前派往 Y 国的espionage名单。这两份名单列表可能有些重叠。因为espionage可能同时扮演两个角色,称之“双重espionage”。因此,Y 国可以把双重espionage送回 X 国。很明显,这对 X 国是有利的,因为双重espionage可以把 Y 国的机密文件带回,而不必担心在 Y 国边境被拘留。所以指挥官决定抓住由 Y 国派出的espionage,让普通人和双重espionage进入。那么你能确定指挥官需要抓捕的espionage名单吗?
输入格式
有多组测试数据。
每组数据由四部分组成:
第一部分包含 3 个整数 A、B、C,分别代表进入边境的人数、Y 国将派出的espionage人数,X 国以前派到 Y 国的espionage人数。
第二部分包含 A 个字符串,为进入边境的人员名单。
第三部分包含 B 个字符串,为由 Y 国派出的间谍名单。
第四部分包含 C 个字符串,即双重espionage的名单。
在一份名单中不会有名字重复,如果有重复的名字出现在两份名单中,则表示同一人。
姓名字符串长度不超过 10,
各名单列表最多 500 人。
输出格式
按照列表 B 的出现顺序输出指挥官要抓捕的espionage名单。
如果不应抓捕任何人,则输出 “No enemy spy”。
输入样例
8 4 3
Zhao Qian Sun Li Zhou Wu Zheng Wang
Zhao Qian Sun Li
Zhao Zhou Zheng
2 2 2
Zhao Qian
Zhao Qian
Zhao Qian
输出样例
Qian Sun Li
No enemy spy
知识总结
- #include <bits/stdc++.h> C++万能头文件
- set集合的方法insert、count
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m,k;
while(cin>>n>>m>>k)
{
string ba[505];
set<string> a;
set<string> b;
set<string> c;
set<string> d;
int f=0;
for(int i=0;i<n;i++)
{
string x;
cin>>x;
a.insert(x);//入境名单
}
for(int i=0;i<m;i++)
{
cin>>ba[i];
b.insert(ba[i]);//Y国派出的人
}
for(int i=0;i<k;i++)
{
string x;
cin>>x;//X国派出的
if(b.count(x)==0)
c.insert(x);//不是双重
else
d.insert(x);//是双重
}
for(int i=0;i<m;i++)
{
if(d.count(ba[i])==0&&a.count(ba[i]))
{//不是双重且在Y国名单里的必然是真正的espionage
f=1;
cout<<ba[i]<<" ";
}
}
if(f)
cout<<endl;
else
cout<<"No enemy spy"<<endl;
}
return 0;
}