1.链式存Hash表,用邻接表存 拉链法
const int N = 1e5 + 10, mod = 100003;
int h[N], ne[N], e[N], len, n, x;
void add(int x)
{
int head = ((x % mod) + mod) % mod;
e[len] = x;
ne[len] = h[head];
h[head] = len++;
}
bool query(int x)
{
int head = ((x % mod) + mod) % mod;
for (int i = h[head]; ~i; i = ne[i])
{
if (x == e[i])
return true;
}
return false;
}
开放寻址法
const int mod = 100003, null = 0x3f3f3f3f;
int h[mod * 3], x, n;
int find(int x)
{
int k = ((x % mod) + mod) % mod;
while (h[k] != null && h[k] != x)
{
k++;
if (k == mod)
k = 0;
}
return k;
}
int main()
{
memset(h, 0x3f, sizeof h);
scanf("%d", &n);
int k = find(n);
if(h[k] == null) cout << "还没有存过这个数" << endl;
h[k] = n;//存入
return 0;
}
字符串Hash
typedef unsigned long long ULL;
const int N = 1e5 + 10, P = 1331;
ULL p[N], h[N];
int n, m;
char s[N];
ULL query(int l, int r)
{
return h[r] - h[l - 1] * p[r - l + 1];
}
int main()
{
scanf("%d%d", &n, &m);
scanf("%s", s + 1);
p[0] = 1;
for (int i = 1; i <= n; i++)
{
p[i] = p[i - 1] * P;
h[i] = h[i - 1] * P + s[i] - 'a' + 1;
}
}