//https://www.nowcoder.com/practice/3350d379a5d44054b219de7af6708894?tpId=37&rp=1&ru=%2Fexam%2Foj%2Fta&qru=%2Fexam%2Foj%2Fta&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D37%26type%3D37&difficulty=&judgeStatus=&tags=&title=94&gioEnter=menu

#include <iostream>
#include <string>
#include <map>
#include <algorithm>
#include <vector>

using namespace std;

struct person{
    int index;
    int ticket;
};

int cmp(const pair<string, struct person> &p1, const pair<string, struct person> &p2){    //'<'对pair操作符的重载是const
    return p1.second.index<p2.second.index;
}

int main() {
    int pnum = 0;
    int tnum = 0;
    string pstr;
    string tstr;
    int inv = 0;
    map<string, struct person> ans;
    struct person p = {0, 0};
    vector<pair<string, struct person>> tans;


    cin >> pnum;
    for(int i = 0;i<pnum;i++){
        cin >> pstr;
        p.index = i;
        ans.insert({{pstr, p}});
    }

    cin >> tnum;
    for(int i = 0;i<tnum;i++){
        cin >> tstr;
        if(ans.count(tstr))
            ans[tstr].ticket++;
        else
            inv++;
    }

    for(const pair<string, struct person> &p:ans)
        tans.push_back(p);

    sort(tans.begin(), tans.end(), cmp);

    for(const pair<string, struct person> &p:tans) //不加const会报错,原因是map键值为const类型
        cout << p.first << " : " << p.second.ticket <<endl;

    cout << "Invalid : " << inv <<endl;

}