【PAT甲级】1078 Hashing (25 分)(哈希表二次探测法)

题意:

输入两个正整数M和N(M<=10000,N<=M)表示哈希表的最大长度和插入的元素个数。如果M不是一个素数,把它变成大于M的最小素数,接着输入N个元素,输出它们在哈希表中的位置(从0开始),如有冲突采取二次探测法处理冲突。

trick:

测试点1包含M为1的数据,1不是素数。。。

代码:

#include<bits/stdc++.h>
using namespace std;
int a[10007];
int ans[10007];
int vis[100007];
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int m,n;
cin>>m>>n;
int flag=0;
for(int i=2;i*i<=m;++i){
if(m%i==0){
flag=1;
break;
}
}
if(flag||m==1){
for(int i=m+1;;++i){
int flag2=0;
for(int j=2;j*j<=i;++j){
if(i%j==0){
flag2=1;
break;
}
}
if(!flag2){
m=i;
break;
}
}
}
for(int i=1;i<=n;++i)
cin>>a[i];
for(int i=1;i<=n;++i){
int tamp=a[i]%m;
if(!vis[tamp]){
vis[tamp]=1;
ans[i]=tamp;
}
else{
int flag3=0;
for(int j=1;j<n;++j){
if(!vis[(tamp+j*j)%m]){
vis[(tamp+j*j)%m]=1;
ans[i]=(tamp+j*j)%m;
flag3=1;
break;
}
}
if(!flag3)
ans[i]=-1;
}
}
for(int i=1;i<=n;++i){
if(ans[i]==-1)
cout<<"-";
else
cout<<ans[i];
if(i<n)
cout<<" ";
}
return 0;
}

猜你喜欢

转载自www.cnblogs.com/ldudxy/p/11820671.html