清华大学算法训练营——算法四:数字盒子

数字盒子(HashTable)

问题描述

你有一个盒子,你可以往里面放数,也可以从里面取出数。

初始时,盒子是空的,你会依次做 Q 个操作,操作分为两类:

  1. 插入操作:询问盒子中是否存在数 x,如果不存在则把数 x 丢到盒子里。
  2. 删除操作:询问盒子中是否存在数 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

提示

对于 x 较小的情况,我们只需要用数组记录每个数是否在盒子里即可。

对于 x 较大的情况,我们可不可以用什么方法把它们“变小”呢?可以想想哈希表哦!

set

#include <iostream>
#include <set>
typedef long long ll;
using namespace std;
set<ll>set1;
bool func(int op, ll x){
    if(op == 1){
        if(set1.count(x))
            return false;
        else{
            set1.insert(x);
            return true;
        }
    }
    else{
        if(set1.count(x)){
            set1.erase(x);
            return true;
        }
        else return false;
    }
}
int main(){
    int N,op;
    ll x;
    cin>>N;
    while(N--){
        scanf("%d %lld",&op,&x);
        if(func(op,x)) printf("Succeeded\n");
        else printf("Failed\n");
    }
}

Hashtable

#include <iostream>
#include <vector>
#include <set>
#include <stdio.h>
#define mod 1000003
typedef long long ll;
using namespace std;
vector<ll>ht[mod];
inline int MOD(ll x){
    return x%mod;
}
bool func(int op, ll x){
    ll hashnum = MOD(x);
    //通过ptr是否在end()判断x是否存在与vector
    vector<ll>::iterator ptr = ht[hashnum].end();
    for(vector<ll>::iterator it = ht[hashnum].begin();it!=ht[hashnum].end();++it)
        if(*(it) == x){
            ptr = it;
            break;
        }
    if(op == 1){
        //插入操作
        if(ptr == ht[hashnum].end()){
            ht[hashnum].push_back(x);
            return true;
        }
        else return false;
    }
    else{
        //删除操作 把最后一个数覆盖ptr位置,删除最后一个数(pop_back())
        if(ptr == ht[hashnum].end()) return false;
        else{
            *(ptr) = ht[hashnum].back();
            ht[hashnum].pop_back();
            return true;
        }
    }
}
int main() {
    //freopen("/Users/zhaohaibo/Desktop/test.txt","r",stdin);
    int N,op;
    ll x;
    cin>>N;
    while(N--){
        scanf("%d %lld",&op,&x);
        if(func(op,x))
            printf("Succeeded\n");
        else printf("Failed\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhaohaibo_/article/details/81455787