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

Data Range

对于 30% 的数据,\(1 \leq n \leq 100\), 给出的数不大于 \(100\), 均为非负整数;

对于 50% 的数据,\(1 \leq n \leq 10000\), 给出的数不大于 \(10000\), 均为非负整数;

对于 100% 的数据,\(1 \leq n \leq 50000\), 给出的数在 32 位有符号整数范围内.

Explanation

此题可以水 STL, 然而:

行末要输出空行!! !! !

行末要输出空行!! !! !

行末要输出空行!! !! !

因为这个多交了五六遍...... [Facepalm]

附上 WA 代码 (离散化应该没有错, 然而...... ) :


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
typedef long long lli;
const int maxn = 50100;

struct srtr
{
    lli dat;
    int pos;
};
bool operator < (srtr a, srtr b)
    { return a.dat < b.dat; }

int T, n;
srtr arr[maxn];
lli do_print[maxn];

void work_data(void)
{
    memset(arr, 0, sizeof(arr));
    memset(do_print, 0, sizeof(do_print));
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%lld", &arr[i].dat);
        arr[i].pos = i;
    }
    sort(arr + 1, arr + 1 + n);
    for (int i = 1; i <= n; i++)
        if (arr[i].dat != arr[i - 1].dat)
            do_print[arr[i].pos] = arr[i].dat;
    // Printing
    bool last_printed = false;
    for (int i = 1; i <= n; i++)
        if (do_print[i]) {
            printf("%s%lld", last_printed ? " " : "", do_print[i]);
            last_printed = true;
        }
    return ;
}

int main(int argc, char** argv)
{
    scanf("%d", &T);
    for (int idx = 1; idx <= T; idx++)
        work_data();
    return 0;
}

Source Code


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <set>

using namespace std;
typedef long long lli;

int T, n;

int main(int argc, char** argv)
{
    scanf("%d", &T);
    for (int idx = 1; idx <= T; idx++) {
        scanf("%d", &n);
        set<lli> st;
        lli x; scanf("%lld", &x);
        st.insert(x);
        printf("%lld", x);
        for (int i = 2; i <= n; i++) {
            lli x; scanf("%lld", &x);
            if (st.find(x) != st.end())
                continue;
            st.insert(x);
            printf(" %lld", x);
        }
        printf("\n");
    }
    return 0;
}