P4305 [JLOI2011]不重复数字
STL unordered_map
这是最好懂的一种办法,看到题目第一眼会想到桶,但是数据范围不够开,所以可以把这个搬出来。但是需要编译器配置到C++11…
//2.18s / 2.60MB / 517B C++14 (GCC 9)
#include<bits/stdc++.h>
using namespace std;
unordered_map<int,int>mp;
int T,n;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main()
{
int T;
T=read();
while(T--)
{
unordered_map<int,int>mp;
n=read();
for(int i=0;i<n;i++)
{
int x;
x=read();
if(mp[x]) continue;
mp[x]=1;
printf("%d ",x);
}
cout<<endl;
}
return 0;
}
结构体排序两次
输入数据后按值排序,对排序后的结果查重后再按照之前保存的编号大小排序后输出。
//2.30s / 3.13MB / 921B C++14 (GCC 9)
#include<bits/stdc++.h>
using namespace std;
int T,n;
struct Node
{
int v,id;
}node[50010],uni[500010];
bool cmp1(Node x,Node y)
{
if(x.v!=y.v)
return x.v<y.v;
else return x.id<y.id;
}
bool cmp2(Node x,Node y)
{
return x.id<y.id;
}
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main()
{
int T;
T=read();
while(T--)
{
n=read();
for(int i=0;i<n;i++)
{
node[i].v=read();
node[i].id=i;
}
sort(node,node+n,cmp1);
int k=0;
uni[k].v=node[0].v;
uni[k++].id=node[0].id;
for(int i=0;i<n-1;i++)
{
if(node[i].v!=node[i+1].v)
{
uni[k].v=node[i+1].v;
uni[k++].id=node[i+1].id;
}
}
sort(uni,uni+k,cmp2);
for(int i=0;i<k;i++)
printf("%d ",uni[i].v);
cout<<endl;
}
return 0;
}
哈希+邻接表
把数据映射到哈希表里,但是有一定概率会出现哈希冲突,于是把每个哈希值作为一个头指针,每次输入一个数据后算出该数据的哈希值,遍历该哈希值头指针对应的链,看看之前有没有出现过这个数,如果没有的话就插入这条链并输出该值。
//1.02s / 1.46MB / 761B C++14 (GCC 9)
#include<bits/stdc++.h>
using namespace std;
const int N=100010,mod=1e5+7;
int nex[N],head[N],val[N];
int T,n;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main()
{
int T;
T=read();
while(T--)
{
memset(nex,0,sizeof(nex));
memset(head,0,sizeof(head));
int n;
n=read();
for(int i=1;i<=n;i++)
{
val[i]=read();
int ha=(val[i]%mod+mod)%mod;
int ok=1;
for(int j=head[ha];j;j=nex[j])
{
if(val[j]==val[i])
{
ok=0;
break;
}
}
if(ok)
{
nex[i]=head[ha];
head[ha]=i;
printf("%d ",val[i]);
}
}
cout<<endl;
}
}
我觉得码风纯正,应该很下饭QAQ。