维护一个集合,支持如下几种操作:
I x
,插入一个数 x;Q x
,询问数 xx 是否在集合中出现过;
现在要进行 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
#include<iostream>
#include<cstring>
using namespace std;
//(1)分离链接法(拉链法)
//const int N=100003;
//int p[N],e[N],ne[N],idx, n;
/*
void insert(int x)
{
int k=(x%N+N)%N;//保证取模为正数
e[idx]=x;
ne[idx]=p[k];//把空放在最后
p[k]=idx;
idx++;
}
bool find(int x)
{
int k=(x%N+N)%N;
for(int i=p[k];i!=-1;i=ne[i])//找到头节点往下找
{
if(e[i]==x)
return true;
}
return false;
}
*/
//(2) 开放寻址法
const int N=200003;//开辟测试数据的2倍空间保证空间一定够用;
const int Max=0x5f5f5f5f;
int p[N],n;
int find(int x)
{
int k=(x%N+N)%N;
while(p[k]!=Max&&p[k]!=x)
{
k++;
if(k==N)k=0;
}
return k;
}
int main()
{
cin>>n;
memset(p,0x5f,sizeof p);//p内所有字节设为-1,标志为空
while(n--)
{
char ch;int x;
cin>>ch;
cin>>x;
int k=find(x);
if(ch=='I')
{
p[k]=x;
}
else {
if(p[k]!=Max)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
}
一: 拉链法
把数教列到某 指定长度的数组
设数组长度为n
把大于几的数或小于一n的教取模
然后映射到对应的表格内
对于取模结果相同时采用链式结构
采用一个链连表来维护散列表
二:开放寻址法
开启辛一六大于测试用例
2倍的 数组
把数组每个元素级为大于
最大测I试数据的数
依次放入
三:二次探测法
将一个由若干个不同正整数构成的整数序列插入到一个哈希表中,然后输出输入数字的位置。
哈希函数定义为 H(key)=key%TSize,其中 TSize 是哈希表的最大大小。
利用只具有正增量的二次探测法来解决冲突。
注意,哈希表的大小最好是素数,如果用户给出的最大大小不是素数,则必须将表大小重新定义为大于用户给出的大小的最小素数。
输入格式
第一行包含两个整数 MSize和 N,分别表示用户定义的表的大小以及输入数字的数量。
第二行包含 N 个不同的正整数,数字之间用空格隔开。
输出格式
在一行中,输出每个输入数字的相应位置(索引从 0 开始),数字之间用空格隔开,行尾不得有多余空格。
如果无法插入某个数字,则输出 -
。
数据范围
1≤MSize≤104
1≤N≤MSize
输入数字均在 [1,105] 范围内。
输入样例:
4 4
10 6 4 15
输出样例:
0 1 4 -
#include<iostream>
using namespace std;
const int N=10e4+9;
int a[N];
int m,n,msize;
int Issu()
{
for(int i=m;i;i++)
{
int flag=1;
for(int j=2;j*j<=i;j++)
{
if(i%j==0){
flag=0;
break;
}
}
if(flag)
{
if(i==1)
msize=i+1;
else
msize=i;
break;
}
}
}
int find(int x)
{
int j=1;
int key=(x%msize+msize)%msize;
int tmp=key;
while(a[tmp]!=-1&&a[tmp]!=x)
{
if(j==msize)return -1;
tmp=(key+j*j)%msize;
j++;
}
return tmp;
}
int main()
{
cin>>m>>n;
Issu();
for(auto &i:a)i=-1;
while(n--)
{
int x;
cin>>x;
int k=find(x);
if(k==-1){
cout<<'-'<<' ';
}
else { a[k]=x;
cout<<k<<' ';
}
}
}