#include <iostream> #include <sstream> #include <string> #include <unordered_map> #include <utility> #include <vector> #include <queue> using namespace std; struct Record { string name; int line; int cnt; Record(string _name, int _line, int _cnt):name(_name),line(_line),cnt(_cnt){ } }; int main() { string path; int line; // name line count unordered_map<string, Record*> hash; queue<string> q; while (cin >> path >> line) { // 注意 while 处理多个 case stringstream ss(path); string name; while(getline(ss, name,'\\')){} int pos = name.size() - 16; string newName; if(pos > 0){ newName = name.substr(pos, 16); } else { newName = name; } string key = newName + to_string(line); if(hash.count(key) > 0){ hash[key]->cnt++; } else { hash[key] = new Record(newName,line,1); q.push(key); if(q.size() > 8){ q.pop(); } } } while(!q.empty()){ auto rcd = hash[q.front()];q.pop(); cout << rcd->name << " " << rcd->line << " " << rcd->cnt << endl; } return 0; } // 64 位输出请用 printf("%lld")
使用队列用来记录,哈希表用来去重