2007年分割槽聯賽提高組之一 統計數字(SSL 1063)
阿新 • • 發佈:2019-02-06
Description
某次科研調查時得到了n個自然數,每個數均不超過1500000000(1.5*109)。已知不相同的數不超過10000個,現在需要統計這些自然數各自出現的次數,並按照自然數從小到大的順序輸出統計結果。
Input
輸入包含n+1行;
第一行是整數n,表示自然數的個數;
第2~n+1每行一個自然數。
Output
輸出包含m行(m為n個自然數中不相同數的個數),按照自然數從小到大的順序輸出。每行輸出兩個整數,分別是自然數和該數出現的次數,其間用一個空格隔開。
Sample Input
8
2
4
2
4
5
100
2
100
Sample Output
2 3
4 2
5 1
100 2
Hint
40%的資料滿足:1<=n<=1000
80%的資料滿足:1<=n<=50000
100%的資料滿足:1<=n<=200000,每個數均不超過1500 000 000(1.5*109)
比較普通的雜湊,初步學。
var
a:array[0..300001,1..2] of longint;
px:array[0..300001] of longint;
i,n,m,j,k,l,now,x,w:longint;
procedure qsort(l,r:longint);
var
i,j,mid,t:longint;
begin
i:=l; j:=r; mid:=px[(l+r) div 2];
repeat
while px[i]<mid do inc(i);
while px[j]>mid do dec(j);
if i<=j then begin
t:=px[i];
px[i]:=px[j];
px[j]:=t;
inc(i);
dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
procedure hs(y:longint);
var
i,key,k:longint;
begin
key:=300001;
k:=y mod key;
i:=0;
while (a[k+i,1]<>0) and (a[k+i,1]<>y) do inc(i);
if a[i+k,1]=0 then begin
a[i+k,1]:=y;
px[now]:=y;
inc(now);
inc(a[i+k,2]);
end
else inc(a[i+k,2]);
end;
begin
readln(n);
now:=1;
for i:=1 to n do
begin
readln(x);
hs(x);
end;
qsort(1,n);
while px[w]=0 do inc(w);
for i:=w to w+now-2 do
begin
j:=0;
k:=px[i] mod 300001;
while (a[k+j,1]<>0) and (a[k+j,1]<>px[i]) do inc(j);
writeln(px[i],' ',a[k+j,2]);
end;
end.