题目大意
给定n个数,每个数均不超过1.5*109,统计这些数各自出现的次数,并按照从小到大的顺序输出统计结果。
题目解析
数据规模有1.5*109,所以散列关键字本身作为地址会爆
所以想到用哈希表
除了记录某个S是否出现,还要记录出现的次数,所以可以用一个二维数组,加一个存储出现次数的即可。
完后,将哈希表里的数放在一个新开的数组,排序后输出
#include<iostream>
#include<cstdio>
#include<algorithm>
#define h(x) x%p
#define p 1000007//质数
using namespace std;
struct A
{
int x,n;
}ans[p];
int n,x,a[p][2],num;
//a[x][0] 记录哈希函数值为x的S值,a[x][2] 记录这个 S 值出现了几次
int loc(int x)
{
int k=h(x),i=0;
while(a[(k+i)%p][0]!=0&&a[(k+i)%p][0]!=x)
i++;
return (k+i)%p;
}//查找关键字在哈希表的位置
bool cmp(A a,A b)
{
return a.x<b.x;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
int t=loc(x);
a[t][0]=x;
a[t][1]++;//次数+1
}
for(int i=1;i<p;i++)
if(a[i][1]>0)
{
ans[++num].x=a[i][0];
ans[num].n=a[i][1];
}
sort(ans+1,ans+1+num,cmp);//快速排序
for(int i=1;i<=num;i++)
cout<<ans[i].x<<" "<<ans[i].n<<endl;
}