题目
某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
题解
用Hash表储存数据,把数组多开一个维度,用来储存出现了几次,出现重复就加1。把每种数都放到另一个数组里,把这个数组从小到大排序。最后输出。
代码
const
max=10000007;
var
n,i,k,m:longint;
h:array[0..max,1..2]of longint;
a:array[1..10000]of longint;
function locate(k,s:longint):longint;
var
i:longint;
begin
i:=k mod max;
while (h[i,1]<>0)and(h[i,1]<>k) do
i:=(i+1) mod max;
if s=1 then
begin
h[i,1]:=k;inc(h[i,2]);
if h[i,2]=1 then begin inc(m);a[m]:=k;end;
end
else exit(i);
end;
procedure qsort(l,r:longint);
var
i,j,key,t:longint;
begin
if l>=r then exit;
i:=l;j:=r;
key:=a[l+random(r-l+1)];
repeat
while (a[i]<key)and(i<r) do inc(i);
while (a[j]>key)and(j>l) do dec(j);
if i<=j then
begin
t:=a[i];a[i]:=a[j];a[j]:=t;
inc(i);dec(j);
end;
until i>j;
qsort(i,r);
qsort(l,j);
end;
begin
readln(n);
randomize;
for i:=1 to n do
begin
readln(k);
locate(k,1);
end;
qsort(1,m);
for i:=1 to m do
begin
k:=locate(a[i],2);
writeln(h[k,1],' ',h[k,2]);
end;
end.