Problem:
Search II

You are given a sequence of n integers S and a sequence of different q integers T. Write a program which outputs C, the number of integers in T which are also in the set S.

Input

In the first line n is given. In the second line, n integers are given. In the third line q is given. Then, in the fourth line, q integers are given.

Output

Print C in a line.

Constraints

Elements in S is sorted in ascending order

n ≤ 100000

q ≤ 50000

0 ≤ an element in S ≤ 109

0 ≤ an element in T ≤ 109

Sample Input 1

5
1 2 3 4 5
3
3 4 1

Sample Output 1

3

Sample Input 2

3
1 2 3
1
5

Sample Output 2

0

Sample Input 3

5
1 1 2 2 3
2
1 2

Sample Output 3

2

Notes

Solution in C++ (judge verdict: Accepted)

#include <iostream>
#include <cmath>
#include <cstdio>
#include  <cstdlib>
#include <map>
#include <stack>
#include <queue>
#include <cstdlib>
#include <vector>
#include <string>
using namespace std;

#define rep(i,n) for(int i=0;i<(int)n;i++)
typedef long long ll;
#define SZ(x) ((int)(x).size())

class Bsearch {
public:
	int  n;
	int  q;
	int right;
	int left;
	int middle;
	int S[100000];
	int T[100000];
	void input();
	bool BinaryS(int i);
	void init();

};

void Bsearch::input() {
	
	cin >> n;
	rep(i, n) cin >> S[i];
	cin >> q;
	rep(i, q) cin >> T[i];
	
}

void Bsearch::init() {
	right = n;
	left = 0;
}
bool Bsearch::BinaryS(int i) {
	int key = T[i];
		while (left<right) {
			middle = (left+ right) / 2;
			if (S[middle] == key) {
				return true;
			}
			else if (S[middle]>key) {
				right = middle;
			}
			else{
				left= middle + 1;
			}
		}
		return false;
	}



int main()
{
	int cnt = 0;
	Bsearch b;
	b.input();
	rep(i, b.q) {
		b.init();
		if (b.BinaryS(i)) cnt++;
	}

	cout << cnt << endl;

	return 0;
}