• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
香草味羊扒饭
博客园    首页    新随笔    联系   管理    订阅  订阅
模拟散列表

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

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

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

输入格式

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

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

输出格式

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

每个结果占一行。

数据范围

1≤N≤1051≤N≤105
−109≤x≤109−109≤x≤109

输入样例:

5
I 1
I 2
I 3
Q 2
Q 5

输出样例:

Yes
No
 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 const int N = 100013;//范围是质数的哈希冲突可以达到最小
 6 //定义拉链槽
 7 int h[N];
 8 //拉链相当于一个链表,开两个数组,一个是存储链表里的值,另一个是下一个位置在什么地方
 9 //idx表示当前链表用到了哪个位置
10 int e[N],ne[N],idx;
11 
12 void insert(int k){
13     int x = (k%N + N)%N;
14     e[idx] = k;
15     ne[idx] = h[x];
16     h[x] = idx++;
17 }
18 
19 bool find(int x){
20     int k = (x%N + N)%N;
21     for(int i = h[k];i != -1;i = ne[i]){
22         if(e[i] == x) return true;
23     }
24         return false;
25         
26 }
27 
28 int main(){
29     freopen("in.txt","r",stdin);
30     int n,k;
31     scanf("%d",&n);
32     char op[2];
33     memset(h,-1,sizeof h);
34     while(n -- ){
35         scanf("%s",op);
36         if(!strcmp(op,"I")){
37             scanf("%d",&k);
38             insert(k);
39         }else{
40             scanf("%d",&k);
41             if(k && find(k)){
42                 puts("Yes");
43             }else{
44                 puts("No");
45             }
46         }    
47     }
48     
49 }

 

posted on 2019-09-05 17:40  香草味羊扒饭  阅读(202)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3