Hash第一题,
描述-
输入
-
第一行有一个整数n(0<n<=10000);
随后有n行;
每行可能出现如下的任意一种形式:
第一种:
一个字符串"ADD",接着是一个整数m,随后有m个i;
第二种:
一个字符串"QUERY”,接着是一个整数M,随后有M个ki;
输出
- 输出每次询问的结果"YES"或"NO". 样例输入
-
2 ADD 5 34 343 54 6 2 QUERY 4 34 54 33 66
样例输出
-
YES YES NO NO
其实这道题需要解决两个问题,本题必须要用hash,因为数据量大,采用常规的查找必然超时,两个问题分别是散列函数及处理冲突。.
1.散列函数
Address=Hash(key),这里采用的是除留余数法,
hash(key)=key%p p<=m p要求为不是接近2的幂的质数
2.处理冲突
经过同一散列函数不同的值可能会得到同一值,即产生冲突,这里采用桶的思想,把相同的值放入同一桶,在依次查找,可用STL中的vector实现
AC代码
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<vector>
using namespace std;
vector<int> a[10001];
int main()
{
int num,test;
char Oper[7];
scanf("%d",&test);
while(test--)
{
scanf("%s%d",Oper,&num);
if(Oper[0]=='A')
{
int i,temp,numbers;
for(i=0;i<num;i++)
{
scanf("%d",&numbers);
temp=numbers%10001; //散列函数
a[temp].push_back(numbers);
}
}
else if(Oper[0]=='Q')
{
int temp,j,k,x,len;
for(j=0;j<num;++j)
{
scanf("%d",&x);
temp=x%10001;
len=a[temp].size(); //解决冲突
for(k=0;k<len;++k)
if(a[temp][k]==x)
{
printf("YES\n");
break;
}
if(k==len)
printf("NO\n");
}
}
}
//system("pause");
return 0;
}