bzoj2761: [JLOI2011]不重复数字(hash)

      题目大意:给出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.
View Code
原文地址:https://www.cnblogs.com/Sakits/p/5989763.html