#include<bits/stdc++.h>
#include <iterator>
#include <string>
using namespace std;

map<string, int> m;
vector<string> v;

int main() {

    string s, n;

    while (cin >> s >> n) {
        auto pos = s.find_last_of("\\") + 1;
        s = s.substr(pos, s.length());
        if (s.length() > 16) s = s.substr(s.length() - 16, s.length());

        string tmp = s + " " + n;
        m[tmp] ++;
        if (find(v.begin(), v.end(), tmp) == v.end()) {
            // 如果不存在,则插入新元素
            v.push_back(tmp);
        }
    }

    if (v.size() > 8) {
        for (auto it = v.end() - 8; it != v.end(); ++it) {
            cout << *it << " " <<  m[*it] << endl;
        }
    } else {
        for (auto it = v.end() - v.size(); it != v.end(); it++ ) {
            cout << *it << " " <<  m[*it] << endl;
        }
    }
}

核心思路就是用哈希,键就用文件名后16位加上错误行号,值就是出现的次数。还有一个问题就是出现的顺序问题,因为要去重,所以刚开始使用的是unordered_set但是后来发现它是用hash来排序的,所以不能保证出现顺序,所以用vector来存出现的顺序,在插入之间检查一下是否已经插入过来保证去重。最后输出后八位。