AcWing 840. 模拟散列表(散列hash)
Posted MangataTS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 840. 模拟散列表(散列hash)相关的知识,希望对你有一定的参考价值。
题目连接
https://www.acwing.com/problem/content/description/842/
思路
使用开放寻址法,思路大概是这样我们讲要查询的数模上一个大于n的质数,然后这表示它呗映射到了哪个坑位,如果这个坑位有人的话,那么我们就往下走(假设这些坑位是一个环状),因为我们的坑位数是大于我们要映射的数的,所以不会死循环,这个算法的期望复杂度是O(1)的,但是随着我们映射关系的增加这个常数会变得很大的
代码
#include<bits/stdc++.h>
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000007
#define endl "\\n"
#define PII pair<int,int>
int dx[4]=0,-1,0,1,dy[4]=-1,0,1,0;
ll ksm(ll a,ll b)
ll ans = 1;
for(;b;b>>=1LL)
if(b & 1) ans = ans * a % mod;
a = a * a % mod;
return ans;
ll lowbit(ll x)return -x & x;
const int N = 200003;
//----------------自定义部分----------------
int n,m,q,a[N],null=0x3f3f3f3f;
int find(int x)
int t = (x%N+N)%N;
while(a[t] != null && a[t] != x)
t=(t+1)%N;
return t;
int main()
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
cin>>n;
memset(a,0x3f,sizeof a);
string op;
int x;
for(int i = 1;i <= n; ++i)
cin>>op>>x;
int t = find(x);
if(op == "I") a[t] = x;
else
if(a[t] == x) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
以上是关于AcWing 840. 模拟散列表(散列hash)的主要内容,如果未能解决你的问题,请参考以下文章
Algorithms - Data Structure - Perfect Hashing - 完全散列