~~一般哈希(数据结构)(附模板题AcWing 840 模拟散列表)

(1) 拉链法

int h[N], e[N], ne[N], idx;

// 向哈希表中插入一个数
void insert(int x)
{
    int k = (x % N + 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;
}

(2) 开放寻址法

int h[N];

// 如果x在哈希表中,返回x的下标;如果x不在哈希表中,返回x应该插入的位置
int find(int x)
{
    int t = (x % N + N) % N;
    while (h[t] != null && h[t] != x)
    {
        t ++ ;
        if (t == N) t = 0;
    }
    return t;
}

模板题

模拟散列表

题目描述:

维护一个集合,支持如下几种操作:

“I x”,插入一个数x;
“Q x”,询问数x是否在集合中出现过;
现在要进行N次操作,对于每个询问操作输出对应的结果。

输入格式

第一行包含整数N,表示操作数量。

接下来N行,每行包含一个操作指令,操作指令为”I x”,”Q x”中的一种。

输出格式

对于每个询问指令“Q x”,输出一个询问结果,如果x在集合中出现过,则输出“Yes”,否则输出“No”。

每个结果占一行。

数据范围

1≤N≤105
−109≤x≤109

输入样例:

5
I 1
I 2
I 3
Q 2
Q 5

输出样例:

Yes
No

C++代码如下:

#include 
using namespace std;
const int mod = 100003,maxn = 200005;
int h[maxn];
int find(int x){
    int t = (x % mod + mod) % mod;
    while(h[t] && h[t] != x)   t++;
    return t;
    
}
int main(){
    int n,x;
    cin>>n;
    char op;
    while(n--){
        cin>>op>>x;
        if(op == 'I')   h[find(x)] = x;
        else    cout<<(h[find(x)] == x ? "Yes" : "No")<<endl;
    }
    return 0;
}

你可能感兴趣的:(AcWing算法基础)