关键在于这句:Quadratic probing (with positive increments only) is used to solve the collisions.开始不懂二次探测,因此做不出来。所谓二次探测就是如果num%mSize被占坑了,就看看(num+1*1)%mSize有没有被占,还是被占,看(num+2*2)%mSize……如果一直到(num+(mSize-1)*(mSize-1))%mSize都被占,说明真的插不进去了。
AC代码
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
#include<stdlib.h>
#include<time.h>
using namespace std;
typedef long long LL;
const int maxn = 10007;
const int MOD = 1000000007;
const int INF = 1000000000;//INF:下确界
const LL SUP = (1LL<<63)-1;//SUP:上确界
const double eps = 1e-5;
bool isPrime(int n){//判断一个十进制数是否为素数
if(n<=1)return false;
for(int i=2;i<=(int)sqrt(1.0*n);i++){
if(n%i==0)return false;
}
return true;
}
int main(){
int mSize,n;
scanf("%d%d",&mSize,&n);
if(!isPrime(mSize)){//不是素数,换成大于它的最小素数
for(int i=mSize;i<=maxn;i++){//maxn = 10^4+7是一个素数
if(isPrime(i)){
mSize = i;
break;
}
}
}
bool hashTable[maxn] = {0};
int num;
for(int i=0;i<n;i++){
scanf("%d",&num);
if(!hashTable[num%mSize]){
printf("%d",num%mSize);
hashTable[num%mSize] = true;
}else{//二次探测
bool noFound = true;
for(int j=0;j<mSize;j++){
int index = num+j*j;
if(!hashTable[index%mSize]){
printf("%d",index%mSize);
hashTable[index%mSize] = true;
noFound = false;
break;
}
}
if(noFound)printf("-");//满足if内的条件说明一直j加到mSize-1也没找到空位
}
if(i!=n-1)printf(" ");
}
return 0;
}