#include <cstdarg> #include <cstdio> #include <iostream> #include <map> #include <set> #include <vector> #include <algorithm> using namespace std; int main() { //map记录ask_id与ans_id集合的映射关系 int N; while(cin>>N){ std::map<int,std::set<int>> ask2ans; std::set<int> badman; for(int i=0; i<N; i++){//遍历问题 int ask_id; std::cin>>ask_id;//输入提问者ID int num; cin>>num;//记录每个问题的回答个数 std::set<int> valid_ans;//记录有效答题人ID for(int j=0; j<num; j++){//遍历答题人ID //先排除自问自答,再排除重复 int id; std::cin>>id; auto it1 = valid_ans.find(id); if(id!=ask_id && it1==valid_ans.end()){ valid_ans.insert(id); } } auto it2 = ask2ans.find(ask_id);//看是ask_id是否提问过 if(it2!=ask2ans.end()){//ask_id提问过,合并ans_id集合 set<int> temp = it2->second; valid_ans.insert(temp.begin(),temp.end()); } ask2ans[ask_id] = valid_ans; } //寻找(ask,ans)与(ans,ask)的对应关系 for(auto it1 = ask2ans.begin(); it1!=ask2ans.end(); ++it1){//遍历ask_id的map for(auto it2 = it1->second.begin(); it2 != it1->second.end(); ++it2){//遍历ans_id集合 auto it3 = ask2ans.find(*it2);//找ans_id的map if(it3 !=ask2ans.end()){//(ask,ans)找到了(ans,X) if(it3->second.find(it1->first)!=it3->second.end()){//(ask,ans)找到了(ans,ask) badman.insert(it1->first); badman.insert(it3->first); } } } } //遍历每个人的问题回答者,超过两个作弊就将其也记为作弊 for(auto it1 = ask2ans.begin(); it1!=ask2ans.end(); ++it1){ int count=0; for(auto it2 = it1->second.begin(); it2!=it1->second.end(); ++it2){ auto it3 = badman.find(*it2); if(it3!=badman.end()){ count ++; } } if(count>1){ badman.insert(it1->first); } } std::cout<<badman.size()<<endl; for(auto it = badman.begin(); it!=badman.end(); ++it){ cout<<*it<<" "; } if(badman.size()!=0){ cout<<endl; } } return 0; } // 64 位输出请用 printf("%lld")