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)

因爲出現的數字會很大,如果直接記錄進數組,數組會很大,所以用hash來記錄出現的數字和次數。
記得要排序,因爲hash的尿性,記錄進去的數字不會是排好序的
最後再for一遍記錄次數的數組,判斷不爲零就輸出

var
 hash,count,list:array[0..200001]of longint;
 key,i,j,n,s,t,max,wz:longint;
procedure qsort(l,r:longint);
var
 i,j,mid,t:longint;
begin
 i:=l;
 j:=r;
 mid:=hash[(i+j) div 2];
 repeat
  while hash[i]<mid do inc(i);
  while hash[j]>mid do dec(j);
  if i<=j then
    begin
      t:=hash[i]; hash[i]:=hash[j]; hash[j]:=t;
      t:=count[i]; count[i]:=count[j]; count[j]:=t;
      inc(i);
      dec(j);
    end;
 until i>j;
 if i<r then qsort(i,r);
 if l<j then qsort(l,j);
end;

function locate(n:longint):longint;
var
 wz:longint;
begin
 wz:=n mod key;
 while (hash[wz]<>0)and(hash[wz mod key]<>n) do inc(wz);
 exit(wz);
end;

begin
 read(n);
 key:=200001;
 for i:=1 to n do
   begin
     read(s);
     wz:=locate(s);
     if wz>max then max:=wz;
     hash[wz]:=s;
     inc(count[wz]);
   end;
 qsort(1,max);
 for i:=1 to max do
  if count[i]<>0 then
    begin
      write(hash[i],' ',count[i]);
      writeln;
    end;
end.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章