题目链接:https://www.acwing.com/problem/content/842/
时/空限制:1s / 64MB
题目描述
维护一个集合,支持如下几种操作:
- “I x”,插入一个数x;
- “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;
}