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.io.*;
import java.util.StringTokenizer;

class Customer {
	int n,c;

	Customer(int n,int c) {
		this.n = n;
		this.c = c;
	}

	boolean NotUsed() {
		if (this.n==-1) return true;
		return false;
	}

	void Set(int n) {
		this.n = n;
	}

	void count() {
		this.c++;
	}
}

class List {
	Customer ct[] = new Customer[1000];

	List() {
		for (int i=0;i<1000;i++) {
			ct[i] = new Customer(-1,0);
		}
	}

	void addNewNumber(int n) {
		for (int i=0;i<1000;i++) {
			if (ct[i].NotUsed()) {
				ct[i].Set(n);
				ct[i].count();
				for (int j=i;j>0;j--) {
					if (ct[j].n<ct[j-1].n) {
						Customer t = ct[j-1];
						ct[j-1] = ct[j];
						ct[j] = t;
					} else break;
				}
				break;
			}
			else if (this.ct[i].n==n) {
				ct[i].count();
				break;
			}
		}
	}

	void Search(List list) {
		for (int i=0;i<1000;i++) {
			if (this.ct[i].NotUsed()) break;
			for (int j=0;j<1000;j++) {
				if (list.ct[j].NotUsed()) break;
				if (this.ct[i].n==list.ct[j].n) System.out.println(this.ct[i].n+" "+(this.ct[i].c+list.ct[j].c));
			}
		}
	}
}

class Main {
	public static void main(String args[]) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String buf;

		try {
			List list[] = {new List(),new List()};
			while (!(buf = br.readLine()).equals("")) {
				StringTokenizer st = new StringTokenizer(buf,",");
				list[0].addNewNumber(Integer.parseInt(st.nextToken()));
			}
			while ((buf = br.readLine())!=null) {
				StringTokenizer st = new StringTokenizer(buf,",");
				list[1].addNewNumber(Integer.parseInt(st.nextToken()));
			}
			list[0].Search(list[1]);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}