#include<iostream>
#include<vector>
#include<unordered_map>
#include<string>
#include<queue>
#include<utility>
using namespace std;
// 按照`\`分隔字符串,获得数组
vector<string> split(string str, char c){
    vector<string> res;
    string temp;
    for(auto i: str){
        if(i==c){
            res.push_back(temp);
            temp.clear();
        }else{
            temp+=i;
        }
    }
    res.push_back(temp);
    return res;
}

int main(){
    string str;
    int length;
    // 临时保存split结果
    vector<string> vec;
    // 保存所有不一样的字符串
    vector<string> hold;
    unordered_map<string, int> res;
    // 存入结果
    queue<pair<string, int> >que;
    while(cin >> str >> length){
        vec = split(str, '\\');
        string last = vec.back();
        if(last.size()>16){
            last = last.substr(last.size()-16);
        }
        string ss = last + " " + to_string(length);
        ++res[ss];
        bool flag = false;
        // 如果之前已有就不存
        for(auto item: hold) if(item.compare(ss)==0) {flag = true; break;}
        if(!flag) hold.push_back(ss); 
    }
    int begin=hold.size()>8?hold.size()-8:0;
    for(int i=begin;i<hold.size();i++)
        que.emplace(hold[i], res[hold[i]]);
    while(!que.empty()){
        cout << que.front().first << " " << que.front().second << endl;
        que.pop();
    }
    return 0;
}

可以优化一下,其实不用queue也可以,原本用这个是想实时更新队列,后来发现不行...