#include <bits/stdc++.h> using namespace std; struct rec { pair<string, string> re; //记录 int times;//错误次数 }; rec Q[200];//储存八条我们要选择出来的记录 int front = 0; //我们要选择出来的记录的开头 int Q_size = 0; //我们目前选择出来的记录 int main() { string s; vector<rec> r;//储存迄今为止所有记录(重复就没必要记录) while (getline(cin, s)) { //循环输入每条记录 rec one; int pos1, pos2; //找到最后一个\和空格所在位置 for (int i = 0; i < s.length(); i++) { if (s[i] == '\\') pos1 = i; if (s[i] == ' ') pos2 = i; } string name, cows; //存储文件名和行号 name = s.substr(pos1 + 1, pos2 - pos1 - 1); if (name.length() > 16) name = name.substr(name.length() - 16); //取后面16个 cows = s.substr(pos2 + 1); one.re.first = name; one.re.second = cows; one.times = 1; bool isrepeate = 0; //看看队列里面有没有重复的,如果有,错误次数+1,不需要继续操作了 for (int i = front; i < front + Q_size; i++) { if (Q[i].re == one.re) { Q[i].times++; isrepeate = 1; //和队列的重复 } } if (isrepeate == 1) continue; //看看和曾经出现的记录有没有重复的,如果有,不用管,因为已经被队列淘汰,也是不需要继续操作了 bool isrepeate2 = 0; if (isrepeate == 0) { for (int i = 0; i < r.size(); i++) { if (r[i].re == one.re) { isrepeate2 = 1; //和曾经出现过,又已经被队列淘汰的重复 break; } } } if (isrepeate2 == 1) continue;; //如果既不和队列中已经有的记录冲突,也不和曾经输入过的记录冲突,那么将其入队 if (isrepeate == 0) { if (Q_size == 8) { //如果队满了,出队一个 front++; Q_size--; } Q[front + Q_size] = one; Q_size++; } r.push_back( one);//所有记录应该保存在r中(重复的已经在之前被剔除) } //输出结果 for (int i = front; i < front + Q_size; i++) cout << Q[i].re.first << " " << Q[i].re.second << " " << Q[i].times << endl; } // 64 位输出请用 printf("%lld")