$\huge \color{orange}{成仙之路->}$ $\huge \color{purple}{算法基础课题解}$
完整代码1(map)
#include<bits/stdc++.h>
using namespace std;
int n;
string op,str;
map<string,int> cnt;
int main()
{
cin>>n;
while(n--)
{
cin>>op>>str;
if(op=="I") cnt[str]++;
if(op=="Q") cout<<(cnt[str]?"Yes":"No")<<endl;
}
return 0;
}
完整代码2(拉链法)
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n,x;
char op;
int h[N],e[N],ne[N],idx;
//插入一个数 x
void insert(int x)
{
//使k是0~N-1内的数
int k=(x%N+N)%N;
e[idx]=x;
ne[idx]=h[k];
h[k]=idx++;
}
//寻找一个数 x
bool find(int x)
{
int k=(x%N+N)%N;
for(int i=h[k];~i;i=ne[i])
if(e[i]==x)
return true;
return false;
}
int main()
{
cin>>n;
//初始化数组
memset(h,-1,sizeof h);
while(n--)
{
cin>>op>>x;
if(op=='I') insert(x);
if(op=='Q') cout<<(find(x)?"Yes":"No")<<endl;
}
return 0;
}
完整代码3(开放寻址法)
#include<bits/stdc++.h>
using namespace std;
const int N = 200003, INF = 0x3f3f3f3f;
int n,x;
char op;
int h[N];
//寻找 x,如果有人但不是 x,则找下一个坑位,若发现一个空位,则 x 不存在,并返回该位置
int find(int x)
{
int k=(x%N+N)%N;
while(h[k]!=INF&&h[k]!=x)
{
k++;
if(k==N) k=0;
}
return k;
}
int main()
{
cin>>n;
//初始化数组
memset(h,0x3f,sizeof h);
while(n--)
{
cin>>op>>x;
if(op=='I') h[find(x)]=x;
if(op=='Q') cout<<(h[find(x)]!=INF?"Yes":"No")<<endl;
}
return 0;
}
大佬那几个代表啥意思 h,e,ne,idx?
h表示头结点,e表示x这个值,ne表示在当前这条链里面下个元素的下标,idx就是下标
OK啊,有点懂了。
想问拉链为什么不用链表啊