//hash函数构造方法:除留余数法Hash()
//冲突解决方法:平方探测法Find()
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
int HashTable_Size;
struct cell
{
int info;//0表示无效单元,1表示占用
string data;
};
//找到下一个素数值作为表长
int NextPrime(int N){
int flag,i;
for(i=2*N+1;;i+=2){
flag=1;
for(int j=3;j<=sqrt(i);j+=2){
if(i%j==0){
flag=0;
break;
}
}
if(flag) break;
}
return i;
}
//建立Hash表
cell* CreateHashTable(int N){
HashTable_Size=NextPrime(N);
cell* HashTable=new cell[HashTable_Size];
for(int i=0;i<HashTable_Size;i++){
HashTable[i].info=0;
HashTable[i].data="";
}
return HashTable;
}
//截取参与散列计算的key
#define KEYLENGTH 11 //关键词长度
#define MAXD 5 //参与散列映射计算的字符个数
int sstoi(string key){
int res=0;
for(int i=0;i<MAXD;i++){
res+=(key[i]-'0')*pow(10,i);
}
return res;
}
//计算未发生冲突时的Hash值
//key5:截取后的key
int Hash(int key5){
key5%=HashTable_Size;
return key5;
}
//找到最终的合法可插入位置
int Find(string key,cell* HashTable){
int Cur_pos,New_pos;
Cur_pos=New_pos=Hash(sstoi(key.substr(KEYLENGTH-MAXD,MAXD)));
//发生冲突:当非空,且不是要找的元素时
int Cnum=0;
while(HashTable[New_pos].info>0 && HashTable[New_pos].data!=key){
if(++Cnum%2){//奇数次冲突
New_pos=Cur_pos+(Cnum+1)*(Cnum+1)/4;
if(New_pos>=HashTable_Size){
New_pos=New_pos%HashTable_Size;
}
}else{//偶数次冲突
New_pos=Cur_pos-(Cnum*Cnum/4);
while(New_pos<0){
New_pos+=HashTable_Size;
}
}
}
return New_pos;
}
void Insert(string key,cell* HashTable){
int pos=Find(key,HashTable);
if(HashTable[pos].info==0){
HashTable[pos].info=1;
HashTable[pos].data=key;
}else{
HashTable[pos].info++;
}
}
int main(){
int N;
scanf("%d",&N);
cell* HashTable=CreateHashTable(N);
cell temp;
for(int i=0;i<2*N;i++){
cin>>temp.data;
Insert(temp.data,HashTable);
}
int maxcnt=0,hashid=-1;
int hcnt=0;
for(int i=0;i<HashTable_Size;i++){
if(HashTable[i].info>maxcnt){
maxcnt=HashTable[i].info;
hashid=i;
hcnt=1;
}else if(HashTable[i].info==maxcnt){
hcnt++;
if(HashTable[i].data<HashTable[maxcnt].data){
hashid=i;
}
}
}
cout<<HashTable[hashid].data<<" "<<maxcnt;
if(hcnt>1) cout<<" "<<hcnt;
return 0;
}