标签:哈希 boolean als cte exit bzoj set zoj div
题目大意:给出N个数,要求把其中重复的去掉,只保留第一次出现的数。例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 6 5 4。
随意哈希一下。。。【我不会什么set啊treap啊之类QAQ
代码如下:
var t,n,i,x:longint; v:array[0..500009]of boolean; vv,b,a,ans:array[0..500009]of int64; function hash(x:int64):longint; var xx:longint; begin xx:=((x mod 500009)+500009)mod 500009; while (b[xx]<>x)and(b[xx]<>0) do xx:=(xx+1)mod 500009; b[xx]:=x; exit(xx); end; begin readln(t); while t>0 do begin dec(t); readln(n); fillchar(b,sizeof(b),0); fillchar(v,sizeof(v),false); for i:=1 to n do begin vv[i]:=-1; read(a[i]); x:=hash(a[i]); if not v[x] then begin v[x]:=true; vv[i]:=x; end; end; ans[0]:=0; for i:=1 to n do begin if vv[i]<>-1 then begin inc(ans[0]); ans[ans[0]]:=b[vv[i]]; end; end; for i:=1 to ans[0]-1 do write(ans[i],‘ ‘); writeln(ans[ans[0]]); end; end.
bzoj2761: [JLOI2011]不重复数字(hash)
标签:哈希 boolean als cte exit bzoj set zoj div
原文地址:http://www.cnblogs.com/Sakits/p/5989763.html