题目描述:
X国的情报委员收到一份可靠的信息,信 息表明Y国将派间谍去窃取X国的机密文件。X国指挥官手中有两份名单 列表,一份是Y国派往X国的间谍名单列表,另一份是X国以前派往Y国 的间谍名单列表。这两份名单列表可能有些重叠。因为间谍可能同时 扮演两个角色,称之为“双重间谍”。因此,Y国可以把双重间谍送回 X国。很明显,这对X国是有利的,因为双重间谍可以把Y国的机密文件 带回,而不必担心被Y国边境拘留。所以指挥官决定抓住由Y国派出的 间谍,让普通人和双重间谍进入。那么你能确定指挥官需要抓捕的间 谍名单吗?
分析:
有几个测试用例。每个测试用例都包含4部分。第1部分包 含3个正整数 A、B 、C , A是进入边境的人数, B是Y国将派出的间 谍人数, C是X国以前派到Y国的间谍人数。第2部分包含A 个字符串, 为进入边境的人员名单。第3部分包含B 个字符串,为由Y国派出的间 谍名单。第4部分包含 C个字符串,即双重间谍的名单。每个测试用例 后都有一个空白行。在一份名单列表中不会有任何名字重复,如果有 重复的名字出现在两份名单列表中,则表示同一个人。
(1)定义4个vector,分别记录3行字符串和答案。
(2)判断第2行在第1行中出现但没在第3行中出现的字符串,将 其添加到答案中。
(3)如果答案数组不空,则按顺序输出。
代码:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
vector<string> x,y,z,ans;
int main()
{
int a,b,c;
string s;
while (cin >> a >> b >>c)
{
x.clear(),y.clear(),z.clear(),ans.clear();
for(int i = 0;i < a;i++)
{
cin >> s;
x.push_back(s);
}
for (int i = 0; i < b; i++)
{
cin >> s;
y.push_back(s);
}
for (int i = 0; i < c; i++)
{
cin >> s;
z.push_back(s);
}
for (int i = 0; i < b; i++)//判断第2行在第1行中出现但没在第3行中出现的字符串
{
//find(first,last,val)
//其中first,last为输入迭代器,[first,last)用于指定该函数的查找范围,val为要查找的目标元素
if (find(x.begin(),x.end(),y[i])!=x.end())
if (find(z.begin(),z.end(),y[i])==z.end())
ans.push_back(y[i]);
//find(x.begin(),x.end(),y[i])!=x.end()中!=x.end()这里的end()并不是表示最后一个元素,最后一个元素在end()-1里面
// !=x.end()说明还没走到末尾就已经找到了这个元素,=z.end()说明走到了末尾还没有找到这个元素
/*find函数的源代码如下
*
* template <class _InputIterator, class _Tp>
* inline _LIBCPP_INLINE_VISIBILITY
* _InputIterator
* find(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
* {
* for (; __first != __last; ++__first)
* if (*__first == __value_)
* break;
* return __first;
* }
* */
}
if (!ans.size())
cout << "No enemy spy\n";
else{
for (int i = 0; i < ans.size(); i++)
{
if (i!=0)
cout << " ";
cout << ans[i];
}
cout << endl;
}
}
}