#include#include using namespace std; const int N = 100003; //找打第一个大于数据范围的质数,冲突范围最小 //h[N]是一个槽,是拉链的头节点 //e[N]存储每一个节点的值, //ne[N]用来指向下一个节点 //idx表示当前用到了几个节点 int h[N], e[N], ne[N], idx; //插入操作: void insert(int x) { //因为x的取值范围是−10^9≤x≤10^9,而我们想要做的是要把这个数映射到一个0~10^5范围内 //那就必须要保证x模上某一个数后得到一个整数,我们可以这样操作: //假如说x = -10,N = 100, 那么k = 90, x = -250, N = 100, K = 50 //假如说x = 200, N = 100, 那么k = 0, x = 20, N = 100, K = 20 int k = (x % N + N) % N; //拉链法: //注意这里的插入操作是将新节点插入到头节点 //而h[k]可以看成是单链表中的head指针,指向的头节点的下标 e[idx] = x; ne[idx] = h[k]; h[k] = idx++; } //查找操作: bool find(int x) { int k = (x % N + N) % N; //得到x 映射的数k,就表明如果存在x, 那就一定在h[k]对应的这条拉链上 //那就只需要从头到尾遍历这条单链表,如果找到了们就返回true, for(int i = h[k]; i != -1; i = ne[i]) { if(e[i] == x) return true; } return false; } int main() { int n; scanf("%d", &n); //初始化数组 memset(h, -1, sizeof(h)); while (n--) { char op[2]; int x = 0; scanf("%s%dn", op, &x); if(op[0] == 'I') insert(x); else { if(find(x)) puts("Yes"); else puts("No"); } } return 0; }



