不妨看看注释吖
因为是刷题的原因,所以注释没有那么的详细,但是一切尽在注释中
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
int n,p;
int hash[510],v[510];//定义存储数值的hash表,定义存储数值在hash表中的位置的v数组(位谐音v)
while(cin>>n>>p){
memset(hash,-1,sizeof(hash));//给hash表赋初值-1
int j = 0;//j用来记录位置函数v的增加
for(int i=0; i<n; i++){
int x;
cin>>x;
int z = x%p;//每一个值对表长进行取余
if(hash[z]==-1){//如果哈希表的当前位置没有值,则把数值放到此地,并记录下数值在hash表中的位置,j++
hash[z] = x;
v[j++] = z;
}
else{//否则的话开始平方探测,直至探测到没有值的位置
int f = 1;
int d = 1;
int mid = z;//以当前的z值为中心
while(hash[mid]!=-1){//向两边寻找
mid = (z+f*d*d)%p;//每一次平方探测,都需要对表长取余
f = -f;
if(f==1)
d++;
}
hash[mid] = x;
v[j++] = mid;
}
}
for(int i=0; i<j; i++){
if(i==j-1)
cout<<v[i]<<endl;
else
cout<<v[i]<<" ";
}
}
return 0;
}