P4305 [JLOI2011]不重复数字 简单的hash思想

P4305 [JLOI2011]不重复数字
题解:可以使用Hash的思想,主要有两方面,一、hash函数,二、冲突处理,这里hash函数除余法,冲突一种是线性探测,另一种是开地址法

/*
简单的hash思想 
*/
#include<bits/stdc++.h>
using namespace std;
const int Maxn=1000003; 
vector<int> ans;
int has[Maxn+10];
bool pd(int x)
{
	int ha=abs(x)%Maxn;
	if (has[ha]==-1) return true;
	else
	{
		int i=ha;
		while(has[i]!=-1)
		{
			if (has[i]==x) return false;
			i=i+1;
			i=i%Maxn;
		}
		return true;
	}
}
void in(int x)
{
	int ha=abs(x)%Maxn;
	if (has[ha]==-1) has[ha]=x;
	else
	{
		int i=ha;
		while(has[i]!=-1)
		{
			i=i+1;
			i=i%Maxn;
		}
		has[i]=x;
	}
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		memset(has,-1,sizeof(has));
		ans.clear();
		int n;
		cin>>n;
		for (int i=1;i<=n;i++)
		{
			int x;
			cin>>x;
			if (pd(x))
			{
				in(x);
				ans.push_back(x);
			}
		}
		for (int i=0;i<ans.size();i++)
		{
			cout<<ans[i]<<" ";
		}
		cout<<endl;
	}
	 
}


方法二

/*
简单的hash思想 
*/
#include<bits/stdc++.h>
using namespace std;
const int Maxn=10003; 
vector<int> ans;
vector<int> has[Maxn];
bool pd(int x)
{
	int ha=abs(x)%Maxn;
	for (int i=0;i<has[ha].size();i++)
	{
		if (has[ha][i]==x) return false;
	}
	return true;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		for (int i=0;i<Maxn;i++) has[i].clear();
		ans.clear();
		int n;
		cin>>n;
		for (int i=1;i<=n;i++)
		{
			int x;
			cin>>x;
			if (pd(x))
			{
				has[abs(x)%Maxn].push_back(x);
				ans.push_back(x);
			}
		}
		for (int i=0;i<ans.size();i++)
		{
			cout<<ans[i]<<" ";
		}
		cout<<endl;
	}
	 
}

 

posted @ 2022-03-04 20:40  心悟&&星际  阅读(54)  评论(0编辑  收藏  举报