题目
基本思路
将(-1e9 ~ 1e9)范围的x通过同一哈希函数映射到(0 ~ 1e5)范围内的t上;
若映射到同一t上时,建立单链表;
查询时通过访问映射的t所对应的单链表上快速查询;
代码实现
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e5 + 3;//N为大于1e5的最小的质数,最大可能减少x被映射到同一t上的可能;
int h[N], idx, e[N], ne[N];
void insert(int x)
{
//下面为单链表方法
int t = (x % N + N) % N;//为了使负数也能够映射到正数上
e[idx] = x;
ne[idx] = h[t];
h[t] = idx ;//更新头节点为最新插入的数
idx ++ ;
}
bool find(int x)
{
int t = (x % N + N) % N;
for(int i = h[t]; i != -1; i = ne[i])
{
if(e[i] == x)
{
return true;
}
}
return false;
}
int main()
{
int n;
cin >> n;
memset(h, -1, sizeof h);//将一开始的头节点全部设置为-1
while(n -- )
{
string op;
int x;
cin >> op >> x;
if(op == "I")
{
insert(x);
}
else if(op == "Q")
{
if(find(x))
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
}
return 0;
}