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