Problem:
取引

取引先の顧客番号と取引日を月ごとに記録したデータがあります。今月のデータと先月のデータを読み込んで、先月から２ヶ月連続で取引のある会社の顧客番号と取引のあった回数を出力するプログラムを作成してください。ただし、月々の取引先数は 1,000 社以内です。

Input

今月のデータと、先月のデータが１行の空行で区切られて与えられます。それぞれのデータは以下のような形式で与えられます。

c1,d1
c2,d2
...
...

ci (1 ≤ ci ≤ 1,000) は顧客番号を表す整数、 di (1 ≤ di ≤ 31) は取引日を表す整数です。

Output

２ヶ月連続で取引のある会社について、顧客番号が小さい順に顧客番号と取引回数の総数を空白で区切って出力します。

Sample Input

123,10
56,12
34,14

123,3
56,4
123,5

Output for the Sample Input

56 2
123 3

Solution in JAVA (judge verdict: Accepted)

import java.util.*;
import java.io.*;
import java.awt.geom.*;
import java.math.*;

public class Main {

	static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static final PrintWriter out = new PrintWriter(System.out,false);

	static void solve() throws IOException{
		HashMap<Integer, Integer> map1 = new HashMap<Integer, Integer>();
		HashMap<Integer, Integer> map2 = new HashMap<Integer, Integer>();

		String str;
		while (true) {
			str = br.readLine();
			if (str.equals("")) break;
			String[] s = str.split(",");
			int x = Integer.parseInt(s[0]);

			if (map1.containsKey(x)) {
				map1.put(x,map1.get(x)+1);
			} else {
				map1.put(x,1);
			}
		}

		while ((str = br.readLine()) != null) {
			String[] s = str.split(",");
			int x = Integer.parseInt(s[0]);

			if (map1.containsKey(x)) {
				if (map2.containsKey(x)) {
					map2.put(x,map2.get(x)+1);
				} else {
					map2.put(x,1);
				}
			}
		}

		ArrayList<int[]> list = new ArrayList<int[]>();
		for (int x : map2.keySet()) {
			list.add(new int[]{x, map1.get(x) + map2.get(x)});
		}

		Collections.sort(list, new Comparator<int[]>(){
			public int compare(int[] a, int[] b) {
				return a[0] - b[0];
			}
		});

		for (int[] i : list) {
			out.println(i[0] + " " + i[1]);
		}

	}

	public static void main(String[] args) throws Exception {
		long start = System.currentTimeMillis();

		solve();
		out.flush();

		long end = System.currentTimeMillis();
		//trace(end-start + "ms");
		br.close();
		out.close();
	}

	static void trace(Object... o) { System.out.println(Arrays.deepToString(o));}
}