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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章