/*
*拉链哈希
*/
#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;}
};
拉链哈希 模板 (Chaining Hash | 链式向前星 | 双向链表 | 再哈希 | 动态维护)
于 2023-12-17 14:45:44 首次发布