火眼金睛

题目描述

现在我们需要查出一些作弊的问答社区中的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.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = Integer.parseInt(sc.next());
            HashMap<Integer, ArrayList<Integer>> hm = new HashMap<Integer, ArrayList<Integer>>();
            for (int i = 0; i < n; i++) {
                int qid = Integer.parseInt(sc.next());
                int aid_num = Integer.parseInt(sc.next());
                ArrayList<Integer> aid = new ArrayList<Integer>();

                for (int j = 0; j < aid_num; j++) {
                    aid.add(Integer.parseInt(sc.next()));
                }

                if (hm.containsKey(qid)) {
                    ArrayList<Integer> al = hm.get(qid);
                    for (int j = 0; j < al.size(); j++) {
                        aid.add(al.get(j));
                    }
                    hm.put(qid, aid);
                } else if (!hm.containsKey(qid)) {
                    hm.put(qid, aid);
                }
            }
            System.out.println(func(n, hm));
        }
        sc.close();
    }

    public static String func(int n, HashMap<Integer, ArrayList<Integer>> hm) {
        HashSet<Integer> cheatSet = new HashSet<Integer>();
        ArrayList<Map.Entry<Integer, ArrayList<Integer>>> al = new ArrayList<Map.Entry<Integer, ArrayList<Integer>>>(
                hm.entrySet());
        for (int i = 0; i < al.size(); i++) {
            Integer key1 = al.get(i).getKey();
            ArrayList<Integer> value1 = al.get(i).getValue();
            for (int j = 0; j < al.size(); j++) {
                if (i == j) {
                    continue;
                }
                Integer key2 = al.get(j).getKey();
                ArrayList<Integer> value2 = al.get(j).getValue();
                if (value2.contains(key1) && value1.contains(key2)) {
                    cheatSet.add(key1);
                }
            }
        }

        for (int i = 0; i < al.size(); i++) {
            Integer key1 = al.get(i).getKey();
            ArrayList<Integer> value1 = al.get(i).getValue();
            int num = 0;
            for (int j = 0; j < value1.size(); j++) {
                Integer tmp = value1.get(j);
                if (cheatSet.contains(tmp)) {
                    num++;
                }
            }
            if (num >= 2) {
                cheatSet.add(key1);
            }
        }

        Iterator<Integer> it = cheatSet.iterator();
        StringBuilder sb = new StringBuilder().append(cheatSet.size()).append("\n");
        while (it.hasNext()) {
            sb.append(it.next()).append(" ");
        }

        return sb.toString().trim();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值