#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来存出现的顺序,在插入之间检查一下是否已经插入过来保证去重。最后输出后八位。