纯哈希+平方探测,这里的平方探测很诡异啊,增量的范围最大居然是到表长,没明白怎么回事(猜想大概是采取单纯增长),导致一开始算ASL一直对不上 。
#include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
int msize,n,m,tsize;
vector<int> ht;
bool is_prime(int x){
for(int i = 2; i <= sqrt(x); ++i)
if(x % i == 0) return false;
return true;
}
bool insert(int x){
for(int i = 0; i <= tsize; ++i){
int mod = (x+i*i) % tsize;
if(ht[mod] == -1){
ht[mod] = x;
return true;
}
}
return false;
}
int search(int x){
for(int i = 0; i <= tsize; ++i){
int mod = (x+i*i) % tsize;
if(ht[mod] == x || ht[mod] == -1){
return i+1;
}
}
return tsize+1;
}
int main(){
scanf("%d%d%d",&msize,&n,&m);
for(tsize = msize; tsize <= 10007; ++tsize)
if(is_prime(tsize)) break;
ht.resize(tsize);
ht.assign(tsize,-1);
int a;
for(int i = 0; i < n; ++i){
scanf("%d",&a);
if(!insert(a)){
printf("%d cannot be inserted.\n",a);
}
}
int b;
float cnt = 0;
for(int i = 0; i < m; ++i){
scanf("%d",&b);
cnt += search(b);
}
printf("%.1f",cnt/m);
return 0;
}