这题的输入输出、测试用例都挺恶心的,每个题竟然可以自问自答,也可以重复由同一个人回答,因此用集合方便去重
思路大体不难,但细思还挺绕,需要熟悉哈希表中嵌套集合的遍历语法
#include <iostream>
#include <set>
#include <unordered_map>
#include <unordered_set>
using namespace std;
int main() {
int N;
while (cin >> N) {
unordered_map<int, unordered_set<int>>aq; // 谁回答了什么问题
unordered_map<int, set<int>>qa; // 每个问题由谁来回答
while (N--) {
int qID, aNum;
cin >> qID >> aNum;
while (aNum--) {
int aID;
cin >> aID;
aq[aID].insert(qID);
qa[qID].insert(aID);
}
}
set<int> cheater; // 存储作弊者ID
// 遍历结构【谁回答了什么问题】中的元素,验证A回答了B的问题,同时B回答了A的问题
for (auto iter = aq.begin(); iter != aq.end(); iter++) {
for (auto iter2 = next(iter); iter2 != aq.end(); iter2++) {
if (iter->second.find(iter2->first) != iter->second.end() &&
iter2->second.find(iter->first) != iter2->second.end()) {
cheater.insert(iter->first);
cheater.insert(iter2->first);
}
}
}
// 遍历结构【每个问题由谁来回答】中的元素,如果某问题的回答者都是作弊者,那么他也是作弊者
for (auto& iter : qa) {
if (iter.second == cheater) {
cheater.insert(iter.first);
}
}
cout << cheater.size() << endl;
for (auto& iter : cheater) {
cout << iter << " ";
}
if (cheater.size() != 0) {
cout << endl;
}
}
return 0;
}
时间复杂度:O(N*M),N为问题数量,M为回答者数量
空间复杂度:O(N+M),用于存储两个哈希表

京公网安备 11010502036488号