寻址取值
原理
复杂信息映射到一个易于维护的值域内。
①计算Hash函数的值 ②定位到对应链中依次遍历、比较
模板
const int null = 0x3f3f3f3f;
const int N = 1e5;
int h[N];
int find(int x){
int t = (x%N + N)%N;
while(h[t]!=null && h[t]!=x){
t++;
if(t==N){
t=0;
}
}
return t;
}
memset(h,0x3f,sizeof h);
h[find(x)]=x;//插入某个数
if(h[find(x)]==null){cout<<"Nopes!"<<endl;}//查找某个数是否存在
字符串
原理
把字符串转化为P进制的数字。
前缀和公式:h[i+1]=h[i]*P+x[i];
区间和公式:h[l,r]=h[r]+h[l-1]*p[r-l+1];
模板
const int P =131;
unsigned long long query(int l,int r){
return h[r]-h[l-1]*p[r-l+1];
}
p[0]=1;
h[0]=0;
for(int i = 0;i<n;i++){
p[i+1] = p[i]*P;
h[1+i]=h[i]*P + x[i];
}
//看2字符串是否相同
if(query(l1,r1)==query(l2,r2)){
cout<<"Yes"<<endl;
}