码迷,mamicode.com
首页 > 其他好文 > 详细

[JLOI2011]不重复数字

时间:2019-02-19 20:05:46      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:mem   iostream   tle   tar   hash   ems   顺序   code   功能   

原题链接 https://www.luogu.org/problemnew/show/P4305

 

题解

题目大意:
给出N个数,要求把其中重复的去掉,只保留第一次出现的数。
最后按顺序输出
N <= 50000

然这题是个哈希的典型题目

HASH,我对于它的理解就是一个桶%一个数,当然并不是如此,有很多更好的HASH函数可以更好的减少冲突,例如非十进制数等。

HASH一般用来处理一个元素是否在一个集合内,大部分的时候二分查找+快速排序可以代替这个功能(STL中也有专门用来去重的),但在有些题目的运用上,则必须用到HASH

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
typedef long long ll;
const int N=5e4+5;
ll f[N];
int T,n,z;
inline ll read()//读入优化
{
    ll X=0,w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch==-;ch=getchar();}
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
int find(ll x) {//查找x在HASH表中的位置
    int y=x%N,yy=y;bool a=1;
    while(f[y]!=0 && f[y]!=x) {//若此位置已经有数并且没有找到这个数
        y=(yy*2-y+a)%N;
        a=!a;
    }
    if (f[y]==0) return y;//判断x在不在hash表
    else return -1;
}
int main() {
    T=read();
    while(T--) {//t组数据
        memset(f,0,sizeof(f));
        n=read();
        for(int i=1; i<=n; i++) {
            ll a=read();
            z=find(a);
            if (z!=-1) {//若不在HASH表中,即没有出现过
                printf("%lld ",a);//输出它
                f[z]=a;//并把它放入HASH表
            }
        }
        puts("");
    }
}

 

[JLOI2011]不重复数字

标签:mem   iostream   tle   tar   hash   ems   顺序   code   功能   

原文地址:https://www.cnblogs.com/zzrblogs/p/10403078.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!