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



京公网安备 11010502036488号