1。
#include <iostream>
using namespace std;
struct Hash{
int k;
struct Hash*next;
};
int main()
{
int n;
cin>>n;
int q=11;
Hash**group=new Hash*[q];
for(int i=0;i<q;i++){
group[i]=new Hash;//不要丢!!
group[i]->k=-1;
group[i]->next=NULL;
}
for(int i=0;i<n;i++){
int num;
cin>>num;
int z=num%11;
if(group[z]->k==-1){
group[z]->k=num;
}else{
Hash*flag=new Hash;
Hash*head=group[z];
flag->k=num;
flag->next=head;
group[z]=flag;//此时head指向的地址有没有变,没有
}
}
int t;
cin>>t;
while(t--){
int m;
cin>>m;
int z=m%11;
Hash*fin=group[z];
int key=0;
bool ans=false;
while(fin){
key++;
if(fin->k==m){
cout<<z<<" "<<key<<endl;
ans=true;
break;
}else{
fin=fin->next;
}
}
if(!ans){
cout<<"error"<<endl;
if(group[z]->k==-1){
group[z]->k=m;
}else{
Hash*flag=new Hash;
Hash*head=group[z];
flag->k=m;
flag->next=head;
group[z]=flag;
}
}
}
return 0;
}
2。
#include <iostream>
using namespace std;
int H(int key){
return key%11;
}
int main()
{
int t;
cin>>t;
while(t--){
int m,n;
cin>>m>>n;
int*group=new int[m];
for(int i=0;i<m;i++){
group[i]=-1;
}
for(int i=0;i<n;i++){
int num;
cin>>num;
int z=H(num);
while(group[z%m]!=-1){
z++;//是否会越界,用z%m来解决
}
group[z%m]=num;
}
for(int i=0;i<m;i++){
if(group[i]==-1){
cout<<"NULL";
}else{
cout<<group[i];
}
if(i!=m-1){
cout<<" ";
}
}
int k;
cin>>k;
while(k--){
int num;
cin>>num;
int ans=0;
int fin=0;
int z=H(num);
while(fin<6){
fin++;
if(group[z%m]==-1){
break;
}
if(group[z%m]==num){
ans=1;
break;
}
z++;
}
if(ans==0){
cout<<ans<<" "<<fin<<endl;
}else{
cout<<ans<<" "<<fin<<" "<<z%m+1<<endl;
}
}
}
return 0;
}
上面的错了
#include <iostream>
using namespace std;
int H(int key){
return key%11;
}
int main()
{
int t;
cin>>t;
while(t--){
int m,n;
cin>>m>>n;
int*group=new int[m];
for(int i=0;i<m;i++){
group[i]=-1;
}
for(int i=0;i<n;i++){
int num;
cin>>num;
int z=H(num);
while(group[z%m]!=-1){
z++;
}
group[z%m]=num;
}
for(int i=0;i<m;i++){
if(group[i]==-1){
cout<<"NULL";
}else{
cout<<group[i];
}
if(i!=m-1){
cout<<" ";
}else{
cout<<endl;
}
}
int k;
cin>>k;
while(k--){
int num;
cin>>num;
int ans=0;
int fin=0;
int z=H(num);
while(true){
fin++;
if(group[z%m]==-1){
break;
}
if(group[z%m]==num){
ans=1;
break;
}
z++;
}
if(ans==0){
cout<<ans<<" "<<fin<<endl;
}else{
cout<<ans<<" "<<fin<<" "<<z%m+1<<endl;
}
}
}
return 0;
}
3.
#include <iostream>
#include<math.h>
using namespace std;
int H(int key){
return key%11;
}
int main()
{
int t;
cin>>t;
while(t--){
int m,n;
cin>>m>>n;
int*group=new int[m];
for(int i=0;i<m;i++){
group[i]=-1;
}
for(int i=0;i<n;i++){
int num;
cin>>num;
int z=H(num);
int zz=z;
int kk=1;
while(group[z%m]!=-1){
if(kk%2==1){
z=zz+pow((kk+1)/2,2);
}else{
z=zz-pow(kk/2,2);
}
while(z<0){
z+=m;
}
kk++;
}
group[z%m]=num;
}
for(int i=0;i<m;i++){
if(group[i]==-1){
cout<<"NULL";
}else{
cout<<group[i];
}
if(i!=m-1){
cout<<" ";
}else{
cout<<endl;
}
}
int k;
cin>>k;
while(k--){
int num;
cin>>num;
int ans=0;
int fin=0;
int z=H(num);
int zz=z;
int kk=1;
while(true){
fin++;
if(group[z%m]==-1){
break;
}
if(group[z%m]==num){
ans=1;
break;
}
if(kk%2==1){
z=zz+pow((kk+1)/2,2);
}else{
z=zz-pow(kk/2,2);
}
while(z<0){
z+=m;
}
kk++;
}
if(ans==0){
cout<<ans<<" "<<fin<<endl;
}else{
cout<<ans<<" "<<fin<<" "<<z%m+1<<endl;
}
}
}
return 0;
}