问题 A: DS哈希查找—线性探测再散列
#include<iostream>
using namespace std;
const int N=1e6+10;
int h[N],a[N];
int n,m;
void solve(){
cin>>m>>n;
for(int i=1;i<=m;i++){
h[i]=0;
}
for(int i=1;i<=n;i++){
cin>>a[i];
int t=a[i];
int pos=t%11+1;
bool flag=false;
for(int j=pos;j<=m;j++){
if(!h[j]){
h[j]=t;
flag=true;
break;
}
}
if(!flag)
for(int j=1;j<=m;j++)
if(!h[j]){
h[j]=t;
break;
}
}
for(int i=1;i<=m;i++){
if(!h[i]) cout<<"NULL"<<" ";
else cout<<h[i]<<" ";
}
cout<<endl;
int t;
cin>>t;
while(t--){
int tmp;
cin>>tmp;
int res=-1;
int pos=tmp%11+1;
int cnt=0;
for(int i=pos;i<=m;i++){
cnt++;
if(h[i]==0){
res=-2;
break;
}
if(h[i]==tmp){
res=i;
break;
}
}
if(res==-1){
for(int i=1;i<=pos-1;i++){
cnt++;
if(h[i]==0) break;
if(h[i]==tmp){
res=i;
break;
}
}
}
if(res!=-1&&res!=-2){
cout<<1<<" "<<cnt<<" "<<res<<endl;
}
else{
cout<<0<<" "<<cnt<<endl;
}
}
}
int main(){
int T;
cin>>T;
while(T--){
solve();
}
return 0;
}
DS哈希查找—二次探测再散列
#include<iostream>
using namespace std;
const int N=1e6+10;
int h[N],a[N];
int n,m;
void solve(){
cin>>m>>n;
for(int i=1;i<=m;i++){
h[i]=0;
}
for(int i=1;i<=n;i++){
cin>>a[i];
int t=a[i];
int pos=t%11;
bool flag=false;
if(!h[pos]){
h[pos]=t;
continue;
}
for(int j=1;j<=m;j++){
int a=(pos+j*j)%m;
if(!h[a]){
h[a]=t;
break;
}
int b=(pos-j*j+100*m)%m;
if(!h[b]){
h[b]=t;
break;
}
}
}
for(int i=0;i<m;i++){
if(!h[i]) cout<<"NULL"<<" ";
else cout<<h[i]<<" ";
}
cout<<endl;
int t;
cin>>t;
while(t--){
int tmp;
cin>>tmp;
int res=-1;
int pos=tmp%11;
int cnt=1;
if(h[pos]==tmp){
cout<<1<<" "<<cnt<<" "<<pos+1<<endl;
continue;
}
bool flagl=false,flagr=false;
for(int j=1;j<=m;j++){
if(flagl==false) cnt++;
int a=(pos+j*j)%m;
if(h[a]==0){
flagr=true;
}
if(h[a]==tmp&&flagr==false){
res=a+1;
break;
}
if(flagr==false) cnt++;
int b=(pos-j*j+100*m)%m;
if(h[b]==0){
flagl=true;
}
if(h[b]==tmp&&flagl==false){
res=b+1;
break;
}
if(flagl||flagr) break;
}
if(res!=-1){
cout<<1<<" "<<cnt<<" "<<res<<endl;
}
else{
cout<<0<<" "<<cnt<<endl;
}
}
}
int main(){
freopen("d:\\in.txt","r",stdin);
int T;
cin>>T;
while(T--){
solve();
}
return 0;
}
问题 C: DS哈希查找–链地址法
#include<iostream>
#include<vector>
using namespace std;
const int N=1e4+10;
vector<int>h[N];
int n,m;
int main(){
freopen("d:\\in.txt","r",stdin);
cin>>n;
for(int i=1;i<=n;i++){
int t;
cin>>t;
h[t%11].push_back(t);
}
cin>>m;
while(m--){
int t;
cin>>t;
int cnt=0;
bool flag=false;
for(int i=h[t%11].size()-1;i>=0;i--){
cnt++;
if(h[t%11][i]==t){
flag=true;
cout<<t%11<<" "<<cnt<<endl;
}
}
if(!flag){
cout<<"error"<<endl;
h[t%11].push_back(t);
}
}
return 0;
}