题目一:
解题思路:
拉链法:p表示哈希表头,e表示结点值,ne模拟指针,idex表示存储下标
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+3;
int p[N],e[N],ne[N];
int idex;
void insert(int x)
{
int k=(x%N+N)%N;
e[idex]=x;
ne[idex]=p[k];
p[k]=idex;
idex++;
}
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;
}
int main()
{
int n;
memset(p,-1,sizeof p);
scanf("%d",&n);
while(n--)
{
char t;
int x;
cin>>t>>x;
if(t=='I')
{
insert(x);
}
else{
if(find(x))printf("Yes\n");
else printf("No\n");
}
}
return 0;
}
题目二 字符串哈希
解题思路
时间换空间,模仿十进制的拆分
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10,P=131;
typedef unsigned long long ULL;
char str[N];
int n,m;
ULL h[N], p[N];
ULL find(int l,int r)
{
return h[r]-h[l-1]*p[r-l+1];//此处p[...]表示为位数
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%s",str+1);
p[0]=1;
for(int i=1;i<=n;i++)
{
h[i]=h[i-1]*P+str[i];
p[i]=p[i-1]*P;
}
while(m--)
{
int l1,r1,l2,r2;
cin>>l1>>r1>>l2>>r2;
if(find(l1,r1)==find(l2,r2))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}