数组是“下标”和“值”的一对映射,实际使用中,有时会用到“值”和“下标”的映射,就是告诉你“值”是多少,在接近 O(1)的时间找到对应的“下标”。 坑人的是 noi 竞赛中到现在没有 unorder_map 这个库,用 map 虽然可以,但会拖慢效率。在看了y总的模拟hash的方法后,我就一直用模拟hash来解决此类问题。
#include <cstdio>
#include <cstring>
using namespace std;
//H要取质数,且比映射的总量多3-5倍,如果量超过1万,2倍也可以,但量在1000一下,至少3倍,个人经验
const int N=110,H=997,null=0x3f3f3f3f;//H和null哈希专用
int a[N],n;
int h[H],mp[H];//h数组放的是查询值x
int find(int x){//x是要查询的值,算出对应的hash值,这个hash值作为h和mp数组的下标,然后h和mp数组的值就是一对映射
int t=(x%H+H)%H;
while(h[t]!=null && h[t]!=x){//若h[t]==null,在其他地方要把x放到h[t]里面
t++;
if(t==H) t=0;
}
return t;
}
int main(){
memset(h,0x3f,sizeof h);
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
//把需要查询的变量作为find计算的x值
for(int i=0;i<n;i++){
int hi=find(a[i]);
h[hi]=a[i],mp[hi]=i;//h数组的值是要查询的值,mp放的是另一个映射值
}
for(int i=0;i<5;i++){
int t;scanf("%d",&t);
int ht=find(t);
printf("%d = %d\n",mp[ht],h[ht]);
}
return 0;
}