upper_bound는 찾고자 하는 값보다 큰 값이 처음 나오는 위치를 반환하는 함수이다.
lower_bound는 찾고자 하는 값 이상이 처음 나오는 위치를 반환하는 함수이다.
upper_bound - lower_bound를 하면 중복된 값이 몇개 있는지 알 수 있다.
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int n, m, num;
cin >> n;
vector<int> V(n);
for (int i = 0; i < n; ++i) cin >> V[i];
sort(V.begin(), V.end());
cin >> m;
for (int i = 0; i < m; ++i)
{
cin >> num;
// upper_bound는 찾고자 하는 값보다 큰 값이 처음 나오는 위치
// lower_bound는 찾고자 하는 값 이상이 처음 나오는 위치
cout << upper_bound(V.begin(), V.end(), num) - lower_bound(V.begin(), V.end(), num) << ' ';
}
}