題目描述
定義哈希函數為H(key) = key%11。輸入表長(大於、等於11),輸入關鍵字集合,用二次探測再散列構建哈希表,並查找給定關鍵字。
輸入
測試次數t
每組測試數據格式如下:
哈希表長m、關鍵字個數n
n個關鍵字
查找次數k
k個待查關鍵字
輸出
對每組測試數據,輸出以下信息:
構造的哈希表信息,數組中沒有關鍵字的位置輸出NULL
對k個待查關鍵字,分別輸出:
0或1(0—不成功,1—成功)、比較次數、查找成功的位置(從1開始)
樣例輸入
1 12 10 22 19 21 8 9 30 33 4 41 13 4 22 15 30 41
樣例輸出
22 9 13 NULL 4 41 NULL 30 19 8 21 33 1 1 1 0 3 1 3 8 1 6 6
提示
#include<iostream> using namespace std; #define INF -9999 int main() { int T; cin>>T; while(T--) { int m,n; cin>>m>>n; int *array=new int[m]; for(int i=0;i<m;i++) array[i]=INF; for(int i=0;i<n;i++) { int num; cin>>num; if(array[num%11]==INF) { array[num%11]=num; } else { int di=0; int oper1=0; int oper2=0; while(true) { oper1=di*di; oper2=-di*di; while(oper1>m) { oper1-=m; } while(oper2<0) { oper2+=m; } if(array[(num%11+oper1)%m]==INF) { array[(num%11+oper1)%m]=num; break; } else if(array[(num%11+oper2)%m]==INF) { array[(num%11+oper2)%m]=num; break; } else di++; } } } for(int i=0;i<m;i++) { if(array[i]!=INF) cout<<array[i]; else cout<<"NULL"; if(i!=m-1) cout<<" "; } cout<<endl; int K; cin>>K; while(K--) { int di=0; int oper1=0; int oper2=0; int C; cin>>C; int times=0; while(true) { oper1=di*di; oper2=-di*di; while(oper1>m) oper1-=m; while(oper2<0) oper2+=m; times++; if(array[(C%11+oper1)%m]==C) { cout<<"1"<<" "<<times<<" "<<(C%11+oper1)%m+1<<endl; break; } if(di==0) { di++; continue; } times++; if(array[(C%11+oper2)%m]==C) { cout<<"1"<<" "<<times<<" "<<(C%11+oper2)%m+1<<endl; break; } if(di==m||array[(C%11+oper1)%m]==INF||array[(C%11+oper2)%m]==INF) { cout<<"0"<<" "<<times<<endl; break; } else di++; } } delete []array; } return 0; }