题目描述
现在我们需要查出一些作弊的问答社区中的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();
}
}