Cod sursa(job #721399)

Utilizator ionutz32Ilie Ionut ionutz32 Data 23 martie 2012 17:54:34
Problema Coduri Huffman Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.94 kb
var v,st,dr,l:array[0..1000005] of longint;
v2,b:array[0..1000005] of int64;
min:array[1..2] of longint;
n,i,j,k1,k2:longint;
sol:int64;
s:string;
f,g:text;
bufin:array[1..65000] of byte;
procedure rec(nod,lev:longint;nr:int64);
          begin
          if nod<=n then
             begin
             l[nod]:=lev;
             b[nod]:=nr;
             inc(sol,v[nod]*lev);
             end
          else
              begin
              rec(st[nod-n],lev+1,nr shl 1);
              rec(dr[nod-n],lev+1,(nr shl 1) or 1);
              end;
          end;
procedure citire(var a:longint);
          var c:byte;
          begin
          c:=1;
          while c<=length(s) do
                begin
                a:=a*10+ord(s[c])-48;
                inc(c);
                end;
          end;
begin
assign(f,'huffman.in');
assign(g,'huffman.out');
reset(f);rewrite(g);
settextbuf(f,bufin);
readln(f,s);
citire(n);
for i:=1 to n do
    begin
    readln(f,s);
    citire(v[i]);
    end;
k1:=1;
k2:=1;
for i:=1 to n-1 do
    begin
    for j:=1 to 2 do
        if (k1<=n) and (k2<=i-1) then
           if v[k1]<v2[k2] then
              begin
              min[j]:=k1;
              inc(k1);
              end
           else
               begin
               min[j]:=k2+n;
               inc(k2);
               end
        else
            if k1<=n then
               begin
               min[j]:=k1;
               inc(k1);
               end
            else
                begin
                min[j]:=k2+n;
                inc(k2);
                end;
    if min[1]<=n then
       v2[i]:=v[min[1]]
    else
        v2[i]:=v2[min[1]-n];
    if min[2]<=n then
       v2[i]:=v2[i]+v[min[2]]
    else
        v2[i]:=v2[i]+v2[min[2]-n];
    st[i]:=min[1];
    dr[i]:=min[2];
    end;
rec((n shl 1)-1,0,0);
writeln(g,sol);
for i:=1 to n do
    writeln(g,l[i],' ',b[i]);
close(f);close(g);
end.