拉链哈希表

抄的 OI-wiki。

hash_table?

首先要有哈希函数,将一个特定的复杂结构变成一个整数, 当然, 哈希函数不应有随机性。

然后对于哈希表的值域进行拉链, 避免哈希冲突。

如果哈希表的值域大小为 MM, 表内插入了 NN 个元素, 那么单次查询的期望复杂度是 O(NM)O(NM)(看上去不太靠谱啊)。

比如这题 [USACO12DEC]Running Away From the Barn G 就可以用 hash_table

糊了下代码:

#include<bits/stdc++.h>

using namespace std;

const int N = 100003;

int n,m,a[30];
int tot, hd[N], nt[N], ky[N][30], p[N];
bool eq(int *x,int *y) {
	for(int i=0;i<m;++i) if(x[i]!=y[i]) return false;
	return true;
}
int has() {
	int res = 0;
	for(int i=0;i<m;++i) res = (res*233ll+a[i])%N;
	return (res%N+N)%N;
}
void ad(int x,int i) {
	nt[++tot]=hd[x], hd[x]=tot;
	memcpy(ky[tot],a,sizeof a);
	p[tot] = i;
}
int get(int pp) {
	int x = has();
	for(int i=hd[x]; i; i=nt[i])
		if(eq(ky[i],a)) return p[i];
	return ad(x,pp), -1;
}

int main()
{
	scanf("%d%d",&n,&m);
	ad(0,0);
	int ans = 0;
	for(int i=1;i<=n;++i) {
		int x; scanf("%d",&x); for(int j=0;j<m;++j) a[j]+=((x>>j)&1);
		if(x&1) for(int j=0;j<m;++j) --a[j];
			int pr = get(i);
		if(pr!=-1) ans = max(ans,i-pr);
	}
	cout << ans;
	return 0;
}
posted @   xwmwr  阅读(124)  评论(0编辑  收藏  举报
编辑推荐:
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
阅读排行:
· 为DeepSeek添加本地知识库
· .NET程序员AI开发基座:Microsoft.Extensions.AI
· 精选4款基于.NET开源、功能强大的通讯调试工具
· 数据不出内网:基于Ollama+OneAPI构建企业专属DeepSeek智能中台
· 大模型工具KTransformer的安装
点击右上角即可分享
微信分享提示