HASH表
程序员文章站
2022-07-15 15:26:28
...
数字盒子
问题描述
你有一个盒子,你可以往里面放数,也可以从里面取出数。
初始时,盒子是空的,你会依次做 Q 个操作,操作分为两类:
- 插入操作:询问盒子中是否存在数 x,如果不存在则把数 x 丢到盒子里。
- 删除操作:询问盒子中是否存在数 x,如果存在则取出 x。
对于每个操作,你需要输出是否成功插入或删除。
输入
第一行一个正整数 Q,表示操作个数。
接下来 Q 行依次描述每个操作。每行 2 个用空格隔开的非负整数 op,x 描述一个操作:op 表示操作类型,op=1 则表示这是一个插入操作,op=2 则表示这是一个删除操作;x 的意义与操作类型有关,具体见题目描述。
输出
按顺序对所有操作输出,对于每个操作输出一行,如果成功则输出“Succeeded”(不含引号),如果失败则输出“Failed”(不含引号)。
样例输入
6
1 100
1 100
2 100
1 200
2 100
2 200
样例输出
Succeeded
Failed
Succeeded
Succeeded
Failed
Succeeded
数据范围
对于 60% 的数据,保证 x<10^5。
对于 100% 的数据,保证 x<10^18,Q≤5*10^5。
对于所有数据,保证 op∈{1,2}。
时间限制:10 sec
空间限制:256 MB
提示
[对于 x 较小的情况,我们只需要用数组记录每个数是否在盒子里即可。]
[对于 x 较大的情况,我们可不可以用什么方法把它们“变小”呢?可以想想哈希表哦!]
#include <bits/stdc++.h>
using namespace std;
// ================= 代码实现开始 =================
typedef long long ll;
/* 请在这里定义你需要的全局变量 */
const int Mod = 1000003;
vector<ll> table[Mod];
int Hash(ll x) {
return x% Mod;
}
// 执行操作时会调用这个函数
// op:对应该次操作的 op(具体请见题目描述)
// x:对应该次操作的 x(具体请见题目描述)
// 返回值:如果输出为"Succeeded",则这个函数返回 1,否则返回 0
bool check(int op, ll x) {
int h = Hash(x);
vector<ll>::iterator ptr = table[h].end();
for(vector<ll>::iterator it = table[h].begin();it!=table[h].end();it++)
if(*it == x){
ptr = it;
break;
}
if(op==1){
if(ptr==table[h].end()){
table[h].insert(ptr,x);
return 1;
}return 0;
}
else{
if(ptr!=table[h].end()){
*ptr = table[h].back();
table[h].erase(ptr);
return 1;
}return 0;
}
}
上一篇: 什么是内部类?
下一篇: 一段神奇的c代码错误分析