题目连接:http://codevs.cn/problem/1230/
说白了就是要我们自己手写一个哈希表的数据结构来实现加入和查找功能。map也能直接过(我第一次写就是用map骗AC的)
提一下个人理解的哈希表的实现(以下说的是线性寻址法)。假设有误还请各位大神不吝不吝赐教
用一个数组模拟哈希表,函数f(x)=数字x在哈希表中出现的下标的最小可能值。一般f(x)=x mod t,t就是哈希表的长度
以下就是一个哈希表的演示样例,假设遍历哈希表时指针走出了哈希表的终点。就进入起点又一次遍历
对于每次向哈希表中加入一个数x,从下标f(x)開始查找,以上文所说的遍历方式查找,直到找到装有x这个数的哈希表元素。返回查找成功(哈希表中有x这个数)。假设遍历过程中遇到了空的哈希表的一个元素就返回查找失败(哈希表中没有x这个数)。
插入元素的过程类似于查找。向哈希表中插入数字x时,首先从下标f(x)開始查找,直到找到第一个为0的哈希表元素,将数字x插入进去。
以下是此题代码:
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> #define MAXN 1000008 #define MOD 1000007 using namespace std; int hashTable[MAXN]; void update(int x) //将数字x增加哈希表 { int num=x; x%=MOD; while(1) { if(!hashTable[x]) { hashTable[x]=num; return; } if(hashTable[x]!=num) { x++; if(x==MAXN) x=0; } else return; } } bool query(int x) //查找哈希表中是否有数字x { bool found=false; int num=x; x%=MOD; while(1) { if(!hashTable[x]) return false; if(hashTable[x]!=num) { x++; if(x==MAXN) x=0; } else return true; } } int main() { int n,m,x; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&x); update(x+1); } for(int i=1;i<=m;i++) { scanf("%d",&x); if(query(x+1)) printf("YES "); else printf("NO "); } return 0; }