#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct _log{
char name[50]; //文件名
int line; //行数
int count; //出现次数
int namelength; //名字长度
int appear; //出现位置
} mylog, *plog; //日志参数结构体
int main() {
plog addr[1000]; //指针数组
int curaddr = 0;
char str[50];
int line;
int i, j;
int n = 0;
int dash = 0;
int flag = 0;
int namelength;
memset(str, 0, sizeof(str));
while(scanf("%s", str) != EOF){
scanf("%d", &line);
for(j = 0; j < 50; j++){ //解析文件名和文件名长度
if(str[j] == '\0'){
namelength = j - dash - 1;
break;
}
if(str[j] == '\\'){
dash = j;
}
}
for(i = 0; i < curaddr; i++){ //检测文件名是否出现过
if((!memcmp(&str[dash+1], addr[i]->name, namelength)) && (line == addr[i]->line))
{
addr[i]->count++;
flag = 1;
break;
}
}
if(flag == 0){ //新建日志
addr[curaddr] = malloc(sizeof(mylog));
addr[curaddr]->line = line;
addr[curaddr]->count = 1;
addr[curaddr]->namelength = namelength;
memcpy(addr[curaddr]->name, &str[dash + 1], addr[curaddr]->namelength);
addr[curaddr]->appear = n;
n++;
curaddr++;
}
flag = 0;
memset(str, 0, sizeof(str));
}
for(i = 0; i < curaddr - 1; i++){ //排序
for (j = curaddr - 1; j > i; j--){
if((addr[j]->count > addr[j - 1]-> count)
|| ((addr[j]->count == addr[j - 1]-> count) && (addr[j]->appear < addr[j - 1]-> appear)))
{
plog temp = addr[j];
addr[j] = addr[j - 1];
addr[j - 1] = temp;
}
}
}
int begin = 0;
if(curaddr > 8) curaddr = 8;
for(i = 0; i < curaddr; i++){ //输出
if(addr[i]->namelength < 16) begin = 0;
else begin = addr[i]->namelength - 16;
printf("%s %d %d\n", &(addr[i]->name[begin]), addr[i]->line, addr[i]->count);
}
}