题目链接:https://www.acwing.com/problem/content/842/
时/空限制:1s / 64MB

题目描述

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

  1. “I x”,插入一个数x;
  2. “Q x”,询问数x是否在集合中出现过;

现在要进行N次操作,对于每个询问操作输出对应的结果。

输入格式

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

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

输出格式

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

每个结果占一行。

数据范围

1≤N≤10^5
−10^9≤x≤10^9

输入样例

5
I 1
I 2
I 3
Q 2
Q 5

输出样例

Yes
No

解题思路

题意:维护一个集合,插入一个数和判断一个数是否存在。
思路:构造一个哈希表,利用拉链法直接进行模拟,STL里面也有相应的哈希表。

Accepted Code:

/* 
 * @Author: lzyws739307453 
 * @Language: C++ 
 */
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
struct List {
    int data, next;
    List() {}
    List(int da, int ne) : data(da), next(ne) {}
}list_[MAXN];
int head[MAXN], cnt = 0;
void Insert(int x) {
    int k = (x % MAXN + MAXN) % MAXN;
    list_[++cnt] = List(x, head[k]);
    head[k] = cnt;
}
bool Query(int x) {
    int k = (x % MAXN + MAXN) % MAXN;
    for (int i = head[k]; ~i; i = list_[i].next)
        if (!(list_[i].data != x))
            return true;
    return false;
}
int main() {
    char op;
    int n, x;
    scanf("%d", &n);
    memset(head, -1, sizeof(head));
    for (int i = 0; i < n; i++) {
        scanf(" %c%d", &op, &x);
        if (op != 'Q')
            Insert(x);
        else {
            if (Query(x))
                printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}