題目描述
現在我們需要查出一些作弊的問答社區中的ID,作弊有兩種:1.A回答了B的問題,同時B回答了A的問題。那麼A和B都是作弊。2.作弊ID用戶A和作弊ID用戶B同時回答了C的問題,那麼C也是作弊。已知每個用戶的ID是一串數字,一個問題可能有多個人回答。
輸入描述:
每組數據第一行爲總問題數N(N小於等於200000),第二行開始每行一個問題,第一個數字爲提問人ID,第二個數字爲回答人數,後面則爲所有回答人的ID。(ID均爲0-1000000的整數)
輸出描述:
第一行爲作弊ID數量,第二行開始爲從小到大的每行一個作弊ID。
輸入例子:
3
1 1 2
2 1 1
3 2 1 2
輸出例子:
3
1 2 3
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in=new Scanner(System.in);
while(in.hasNext()){
int n=in.nextInt();//n爲提問的總數
HashSet<Integer> request=new HashSet();//存放提問的所有人ID
HashMap<Integer,HashSet<Integer>> map=new HashMap();//存放提問的人ID和回答人ID的集合
for(int i=0;i<n;i++){//對n個問題進行蒐集
int curID=in.nextInt();//當前提問人的ID
int ansCount=in.nextInt();//回答的人數
HashSet<Integer> set=new HashSet();//回答人ID的集合
for(int j=0;j<ansCount;j++){
set.add(in.nextInt());
}
request.add(curID);
if(!map.containsKey(curID)){//若map中還沒有該curID
map.put(curID,set);
}else{//若已經有了該ID
map.get(curID).addAll(set);
}
}
//handle the first condition
TreeSet<Integer> result=new TreeSet();//存放結果,且排序了
for(int temp: request){
Set<Integer> tempSet=map.get(temp);
for(int num: tempSet){
if(map.containsKey(num)){
if(num!=temp){
Set<Integer> chkSet=map.get(num);
for(int num2: chkSet){
if(num2 == temp){
result.add(num);
result.add(temp);
//request.remove(num);foreach時使用了迭代器,不能更改容器結構
//request.remove(temp);
break;
}
}
}
}
}
}
//handle second
for(int temp: request){
int count=0;
Set<Integer> tempSet=map.get(temp);
for(int num: tempSet){
if(result.contains(num)){
count++;
}
if(count == 2){
result.add(temp);
//request.remove(request);
break;
}
}
}
System.out.println(result.size());
for(int i: result){
System.out.println(i);
}
}
in.close();
}
}