AcWing 840. 模拟散列表--STL大法好
原题链接
简单
作者:
acwing_陌路
,
2021-04-08 22:44:17
,
所有人可见
,
阅读 1507
直接用unordered_map会方便的很多
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <unordered_map>
using namespace std;
int n;
int main()
{
unordered_map<int,int> mp;
cin >> n;
while(n --)
{
string op;
int x;
cin >> op >> x;
if(op == "I")
{
mp[x]++;
}
else
{
if(mp[x] > 0) puts("Yes");
else puts("No");
}
}
return 0;
}
开放寻址法
#include <iostream>
#include <cstring>
using namespace std;
const int N = 200003;//数据开大两倍
const int null = 0x3f3f3f3f;//空指针
int h[N];
int n;
int find(int x)
{
int t = (x % N + N) % N;
while(h[t] != null && h[t] != x)//如果位置不空并且不是x
{
t++;//寻找下一个位置
if(t == N) t = 0;
}
return t;//如果这个位置是空的, 则返回的是他应该存储的位置
}
int main()
{
cin >> n;
memset(h,0x3f,sizeof h);
while(n--)
{
string op;
int x;
cin >> op >> x;
int k = find(x);
if(op == "I") h[k] = x;
else
{
if(h[k] != null) puts("Yes");
else puts("No");
}
}
return 0;
}
拉链法(不常用)
//拉链法
#include <iostream>
#include <cstring>
using namespace std;
const int N = 100003;//取大于1e5的第一个质数
int h[N],e[N],ne[N],idx;//开一个h槽,邻接表
int n;
void insert(int x)
{
int k = (x % N + N) % N;//c++中如果是负数,那他取模也是负的,加N再%N就一定是一个正数
e[idx] = x;
ne[idx] = h[k];
h[k] = idx++;
}
bool find(int x)
{
int k = (x % N + N) % N;
for(int i = h[k];i != -1;i = ne[i])
{
if(e[i] == x) return true;
}
return false;
}
int main()
{
cin >> n;
memset(h,-1,sizeof h);//先将槽清空,用-1表示
while(n--)
{
string op;
int x;
cin >> op >> x;
if(op == "I")
{
insert(x);
}
else
{
if(find(x))
{
puts("Yes");
}
else
{
puts("No");
}
}
}
return 0;
}
果然还是stl大法适合我
呜呜呜,爱STL
还得是stl