1. 程式人生 > >2007年分割槽聯賽提高組之一 統計數字(SSL 1063)

2007年分割槽聯賽提高組之一 統計數字(SSL 1063)

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.