BZOJ2761: [JLOI2011]不重复数字

2761: [JLOI2011]不重复数字

Time Limit: 10 Sec  Memory Limit: 128 MB

Description

给出N个数,要求把其中重复的去掉,只保留第一次出现的数。
例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 6 5 4。
 

Input

输入第一行为正整数T,表示有T组数据。
接下来每组数据包括两行,第一行为正整数N,表示有N个数。第二行为要去重的N个正整数。
 

Output

 
对于每组数据,输出一行,为去重后剩下的数字,数字之间用一个空格隔开。

Sample Input

2
11
1 2 18 3 3 19 2 3 6 5 4
6
1 2 3 4 5 6

Sample Output

1 2 18 3 19 6 5 4
1 2 3 4 5 6

HINT

对于30%的数据,1 <= N <= 100,给出的数不大于100,均为非负整数;


对于50%的数据,1 <= N <= 10000,给出的数不大于10000,均为非负整数;


对于100%的数据,1 <= N <= 50000,给出的数在32位有符号整数范围内。


提示:


由于数据量很大,使用C++的同学请使用scanf和printf来进行输入输出操作,以免浪费不必要的时间。


Source

MAP

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 #define ll long long 
 7 ll read(){
 8      char ch=getchar(),last=' '; ll ans=0;
 9      while (ch>'9' || ch<'0') last=ch,ch=getchar();
10      while (ch<='9' && ch>='0') ans=ans*10+ch-'0',ch=getchar();
11      if (last=='-') ans=-ans; return ans;
12 }
13 #include<map>
14 map<int,bool> M;
15 int Ans[50005],ans;
16 int main(){
17     int T=read();
18     while (T--){
19         int n=read(),a; M.clear(); ans=0;
20         for (int i=1;i<=n;i++){
21             a=read();
22             if (!M[a]) Ans[++ans]=a;
23             M[a]=1;
24         }
25         for (int i=1;i<ans;i++)
26             printf("%d ",Ans[i]);
27         printf("%d
",Ans[ans]);
28     }
29     return 0;
30 }
View Code
原文地址:https://www.cnblogs.com/SXia/p/7681524.html