搜狗——火眼金睛

題目描述

現在我們需要查出一些作弊的問答社區中的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();
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章