题目链接:点击打开链接
题目大意:略。
解题思路:hash,自定义hash规则 + 结构体数组 + 结构体中的每个链表。
AC 代码
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=1e5+100;
ll mi_tel,ma_Cnt;
int mergeCnt;
struct node
{
ll tel;
int cnt;
node *next;
}nds[maxn];
void init()
{
ma_Cnt=0;
mergeCnt=1;
mi_tel=LLONG_MAX;
for(int i=0;i<maxn;i++)
{
nds[i].tel=-1;
nds[i].cnt=0;
nds[i].next=NULL;
}
}
node * findTel(ll tel)
{
node * nd;
// 自定义hash规则
// TEL:130 0571 1862
// -> tel[9] + tel[10] + tel[7] + tel[1] + tel[2]
// -> 62130
int idx=0;
idx+=tel%100;
idx=idx*10+tel/10000%10;
idx=idx*100+tel/100000000%100;
// cout<<"idx = "<<idx<<endl;
nd=&nds[idx];
if(nd->tel==-1)
{
nd->tel=tel;
return nd;
}
while(nd->tel!=tel)
{
if(nd->next==NULL)
{
nd->next=(node*)malloc(sizeof(node));
nd=nd->next;
nd->next=NULL;
nd->tel=tel;
nd->cnt=0;
break;
}
else
nd=nd->next;
}
return nd;
}
void insert(ll tel)
{
node * nd=findTel(tel);
nd->cnt++;
if(nd->cnt>ma_Cnt)
{
ma_Cnt++;
mergeCnt=1;
mi_tel=tel;
}
else if(nd->cnt==ma_Cnt)
{
mergeCnt++;
if(tel<mi_tel) mi_tel=tel;
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
init();
ll tel1,tel2;
for(int i=0;i<n;i++)
{
scanf("%lld%lld",&tel1,&tel2);
insert(tel1);
insert(tel2);
}
printf("%lld %d",mi_tel,ma_Cnt);
if(mergeCnt>1) printf(" %d",mergeCnt);
puts("");
}
return 0;
}