https://www.luogu.org/problemnew/show/P4305
思路:构造哈希表,然后一边输入一边判断输入的数字在哈希表中是否存在,若没有存在就输出这个数,不存在就读入下一个数字
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int k=52453; //质数
struct ha
{
int data;
int status;
ha():status(-1), data(-1){};
};
ha hashtable[k];
bool locate(int x)
{
int position = x % k;//第一个位置
int temp = position;
if(hashtable[position].status == -1)//第一个位置就符合x去放
{
hashtable[position].data = x;
hashtable[position].status = 1;
return true;
}
while(hashtable[position].status != -1 && hashtable[position].data != x )
{
//如果一直冲突查找下一个位置
position = (position + 1) % k;
if(position == temp)//表满了
break;
}
if(hashtable[position].status == -1)//找到空的位置
{
hashtable[position].data = x;
hashtable[position].status =1;
return true;
}
if(hashtable[position].data == x)//找到x存在
return false;
if(position == temp)//表满了
return true;
}
int main()
{
ios::sync_with_stdio (false);
int t;
scanf("%d", &t);
while(t--)
{
for(int i = 0; i <k; i++)//重置
{
hashtable[i].status = -1;
hashtable[i].data = -1;
}
int x;
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &x);
if(locate(x))//如果没有出现过
cout<<x<<" ";
}
cout<<endl;
}
//system("pause");
}