#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int max_ = 0;//每当count增加时,就判断此时增加后的count是不是最大,max_存储当前最大值
int f = 0;//标志有什么并列的狂人
int N;
int samecount = 0;//并列狂人数
char result[20];//狂人的电话号
typedef unsigned long long Index;
Index Hash(const char* key, long long tablesize)//《数据结构与算法分析-C语言描述》中的Hash函数
{
unsigned long long hashval = 0;
while (*(key + 4) != 0) //为什么6改为3 and 4就可以AC????
hashval = (hashval << 5) + *key++;//*(key++)
return hashval % tablesize;
}
struct num_node
{
char num[100];
int count;
struct num_node* next;
};
typedef struct num_node* node_ptr;
node_ptr* createtable(int size)
{
node_ptr* H = new node_ptr[size];
for (int i = 0; i < size; i++)
{
H[i] = new struct num_node;
H[i]->count = 0;
if (H[i] != NULL)
H[i]->next = NULL;
}
return H;
}
void insert(char* str, node_ptr* H)
{
int flag = 0;//标志表中是否已存在此号码
int hashval = Hash(str, 2 * N);
node_ptr s = H[hashval];
while (s->next != NULL)//头结点没有用来存储数据
{
s = s->next;
if (!strcmp(str, s->num))
{
flag = 1;
s->count++;
if (s->count > max_)//每当count变化时判断count是不是当前最大
{
strcpy(result, s->num);
max_ = s->count;
}
break;
}
}
if (flag == 0)
{
node_ptr temp = new num_node;
temp->next = NULL;
strcpy(temp->num, str);
temp->count = 1;
if (temp->count > max_)
{
strcpy(result, temp->num);
max_ = temp->count;
}
s->next = temp;
}
}
void judge(node_ptr* H)
{
for (int i = 0; i < 2 * N; i++)
{
node_ptr s = H[i];
while (s->next != NULL)
{
s = s->next;
if (max_ == s->count and strcmp(result, s->num) != 0)
{
f = 1;
samecount++;
if (strcmp(s->num, result) < 0)
{
strcpy(result, s->num);
}
}
}
}
}
int main()
{
cin >> N;
node_ptr* H = createtable(2 * N);
for (int i = 0; i < N; i++)
{
char str1[20];
cin >> str1;
insert(str1, H);
char str2[20];
cin >> str2;
insert(str2, H);
}
judge(H);//得到最大值的前提下再对有没有并列情况进行判断
if (f == 0)
cout << result << " " << max_;
else if (f == 1)
cout << result << " " << max_ << " " << samecount;
return 0;
}