分离链接法
void inserthash(int num)
{
int numm=num>0?num:-num;
int h=(numm%mod+numm/mod)%mod;
sum[index]=num;
next[index]=hashtable[h];
hashtable[h]=index++;
}
int if_find(int num)
{
int cnt=0;
int numm=num>0?num:-num;
int h=(numm%mod+numm/mod)%mod;
int u=hashtable[h];
while(u)
{
if(sum[u]==num)
cnt++;
u=next[u];
}
return cnt;
}
开放取址法
int hash1(string s)
{
int f=0;
for(int i=0;i<s.size();i++)
f=(f*13+s[i]-'0')%p;
return f;
}
int hash2(string s)
{
int f=0;
for(int i=0;i<s.size();i++)
f=(f*13+s[i]-'0')%p2;
return f;
}
bool have(string s)
{
int f=hash1(s),f2=hash2(s);
while(h[f]&&key[f]!=f2) f++;
if(!h[f])
{
h[f]=1;
key[f]=f2;
return 0;
}
else
return 1;
}