Problem:
A: 情報検索 / Information Search

問題

ポスティングリストとは、検索語と出現文書 ID の対応関係を持たせたリストである。例えば

北海道: 1, 2, 4, 9

観光: 1, 3, 4, 7

などである。

上記のポスティングリストから、and 検索をすると、ID 1, 4 の文書がヒットし、or 検索をすると、ID 1, 2, 3, 4, 7, 9 がヒットする。

ここで and 検索とは「どちらのリストにも含まれる要素を列挙する」ことであり、 or 検索とは「少なくともどちらか一方のリストに含まれる要素を列挙する」ことである。

ポスティングリストが与えられるので、and 検索と or 検索の結果をそれぞれ出力せよ。

入力形式

n m
a_1 a_2 $\ldots$ a_n
b_1 b_2 $\ldots$ b_m

入力はすべて整数からなる。

1 行目には検索すべき 2 つのポスティングリストの長さ n と m が空白区切りで与えられる。

2 行目と 3 行目にはそれぞれのポスティングリストに含まれる ID が空白区切りで与えられる。

制約

1 \leq n, m \leq 2\times10^5

a_i < a_j (i < j)

b_i < b_j (i < j)

1 \leq a_i, b_i \leq 10^9

出力形式

and 検索のヒット数を A、or 検索のヒット数を B とする。

最初の一行に A B の順に空白区切りで出力せよ。

続く A 行に and 検索でヒットした ID を昇順に出力せよ。

続く B 行に or 検索でヒットした ID を昇順に出力せよ。

入力例1

4 4
1 2 4 9
1 3 4 7

出力例1

2 6
1
4
1
2
3
4
7
9

入力例2

4 4
1 3 5 7
2 4 6 8

出力例2

0 8
1
2
3
4
5
6
7
8

入力例3

3 5
1 2 3
1 2 3 4 5

出力例3

3 5
1
2
3
1
2
3
4
5

Solution in JAVA (judge verdict: Accepted)

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Main {
    static Scanner input = new Scanner(System.in);
    private static java.io.PrintWriter out = new java.io.PrintWriter(System.out);

    private static void solve() {
        
        int n = input.nextInt();
        int m = input.nextInt();

        int[] a = arrayInput(n);
        int[] b = arrayInput(m);
        
        Map<Integer, Integer> map = new HashMap<>();
        
        for (int v : a) {
        map.put(v, 1); // the appear of element
        }
        for (int v : b) {
            if (map.containsKey(v)) {
                map.put(v, 2);   
            } else {
                map.put(v, 1);
            }
        }
        
        List<Integer> and = new ArrayList<>();
        List<Integer> or = new ArrayList<>(map.keySet());
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
        if (entry.getValue() == 2) {
            and.add(entry.getKey());
        }
        }
        Collections.sort(and);
        Collections.sort(or);
        
        out.println(and.size() + " " + or.size());
        for (int v : and) {
        out.println(v);
        }
        for (int v : or) {
        out.println(v);
        }
    }

    public static void main(String[] args) {
        solve();
        out.flush();
    }
    

    private static int[] arrayInput(int n) {
        int[] a = new int[n];
        for (int i = 0; i < n; i++)
        a[i] = input.nextInt();
        return a;
    }
}