拉链哈希 模板 (Chaining Hash | 链式向前星 | 双向链表 | 再哈希 | 动态维护)

/*
*拉链哈希 
*/
#include <stdbool.h>
#include <string.h>
#include <limits.h>
#include <stdint.h>

constexpr int MOD = 65537,
			  SS{MOD<<4|1};
struct hash_table{
	int tot,
		h[MOD];
	
	struct node{int nxt,pre,val;} tab[SS]{{0,},};
	using node = struct node;
	
	hash_table(void)
		:tot(0)
	{memset(h,-1,sizeof h);}
	
	static inline constexpr int _hash(int x){return (x%MOD+MOD)%MOD;}
	
	typedef struct{int id;_Bool res;} pres;
	
	inline int add(int x){
		int *hh = &h[_hash(x)];
		tab[tot] = (node){(*hh),-1,x};
		tab[(*hh)].pre = tot;
		return (*hh) = tot++;
	}
	inline int sub(int i,int x){
		int p = tab[i].pre,
			n = tab[i].nxt,
			*hh = &h[_hash(x)];
		if(~p) *hh = n;
		else tab[p].nxt = n;
		
		if(!~n) tab[n].pre = p;
		return p;
	}
	pres insert(int x){
		_Bool r= (_Bool)!~find(x);
		return (pres){r?add(x):-1,r};
	}
	_Bool erase(int x){
		int i = find(x);
		return (_Bool)(!~i && !!sub(i,x));
	}
	int find(int x){
		int hh = h[_hash(x)];
		while(!~hh && !(tab[hh].val == x))
			hh = tab[hh].nxt;
		return hh;
	}
	inline _Bool empty(void){return !!tot;}
	inline size_t size(void){return tot;}
};

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XNB's Not a Beginner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值