Cod sursa(job #964654)

Utilizator RusuAlexeiRusu Alexei RusuAlexei Data 21 iunie 2013 20:26:04
Problema Coduri Huffman Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 2.59 kb
program huffman;

  type arbore=^celula;
       celula=record
                info:int64;
                left,right:arbore;
              end;
       lista=^cel;
       cel=record
             arb:arbore;
             next:lista;
           end;
  var  bufin,bufout:array [1..100000] of byte;
       a:array [1..1000000] of arbore;
       n,i,j:longint;
       l,v,r:lista;
       r1:arbore;
       lung:int64;

procedure dfs(u:arbore;h,bin:int64);
  begin
    if u^.left<>nil then dfs(u^.left,h+1,2*bin);
    if u^.right<>nil then dfs(u^.right,h+1,2*bin+1);
    if (u^.left=nil)and(u^.right=nil) then writeln(h,' ',bin);
  end;

begin
  assign(input,'huffman.in');
  reset(input);
  settextbuf(input,bufin);
  assign(output,'huffman.out');
  rewrite(output);
  settextbuf(output,bufout);

  readln(n);
  for i:=1 to n do
    begin
      new(a[i]);
      readln(a[i]^.info);
    end;

  l:=nil;

  j:=1;
  for i:=1 to n-1 do
    begin
      new(r);
      new(r1);

      if l<>nil then
        begin
          if j>n then
            begin
              r1^.info:=l^.arb^.info;
              r1^.left:=l^.arb;
              l:=l^.next;
            end else begin
          if l^.arb^.info<a[j]^.info then
            begin
              r1^.info:=l^.arb^.info;
              r1^.left:=l^.arb;
              l:=l^.next;
            end else
            begin
              r1^.info:=a[j]^.info;
              r1^.left:=a[j];
              inc(j);
            end;
        end;end else
        begin
           r1^.info:=a[j]^.info;
           r1^.left:=a[j];
           inc(j);
        end;


      if l<>nil then
        begin
          if j>n then
            begin
              r1^.info:=r1^.info+l^.arb^.info;
              r1^.right:=l^.arb;
              l:=l^.next;
            end else begin
          if l^.arb^.info<a[j]^.info then
            begin
              r1^.info:=r1^.info+l^.arb^.info;
              r1^.right:=l^.arb;
              l:=l^.next;
            end else
            begin
              r1^.info:=r1^.info+a[j]^.info;
              r1^.right:=a[j];
              inc(j);
            end;
        end;end else
        begin
           r1^.info:=r1^.info+a[j]^.info;
           r1^.right:=a[j];
           inc(j);
        end;

      lung:=lung+r1^.info;
      r^.arb:=r1;
      r^.next:=nil;
      if l=nil then
        begin
          l:=r;
          v:=r;
        end else
        begin
          v^.next:=r;
          v:=r;
        end;
    end;

  writeln(lung);
  dfs(r1,0,0);
  close(output);
end.