Hash表&字符串Hash

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;
	}
}

发布了103 篇原创文章 · 获赞 203 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_45432665/article/details/104378294