思路:检查某个客人是否有伴侣,如果有,伴侣是否也出现即可。
注意:0个单身狗的时候,不要输出多余的’\n’, 否则会出现格式错误。
AC代码
#include <stdio.h>
#include <string.h>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
const int maxn = 1e5+5;
map<string, int> ID;
vector<string>gue;
vector<int>ans;
int p[maxn]; //伴侣编号
bool vis[maxn];
int id;
int getId(string a) {
if(!ID.count(a)) {
ID[a] = id++;
}
return ID[a];
}
void init() {
ID.clear();
id = 0;
memset(vis, 0, sizeof(vis));
memset(p, -1, sizeof(p));
}
bool cmp(int a, int b) {
return gue[a] < gue[b];
}
int main() {
init();
char a[10], b[10];
int n, m;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%s%s", a, b);
int u = getId(a);
int v = getId(b);
p[u] = v;
p[v] = u;
}
scanf("%d", &m);
for(int i = 0; i < m; i++) {
scanf("%s", a);
gue.push_back(a);
if(ID.count(a)) {
int u = getId(a);
vis[u] = 1;
}
}
for(int i = 0; i < m; i++) {
if(!ID.count(gue[i])) {
ans.push_back(i);
continue;
}
int u = getId(gue[i]);
int par = p[u];
if(!vis[par]) ans.push_back(i);
}
sort(ans.begin(), ans.end(), cmp);
printf("%d\n", ans.size());
for(int i = 0; i < ans.size(); i++) {
if(i == 0) {
cout << gue[ans[i]];
} else {
cout << " " << gue[ans[i]];
}
}
if(ans.size() > 0) printf("\n");
return 0;
}
如有不当之处欢迎指出!