Cod sursa(job #111866)

Utilizator juniorOvidiu Rosca junior Data 2 decembrie 2007 07:15:53
Problema Ordine Scor 20
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.67 kb
var
	a : array ['a'..'{'] of longint;  { acolada urmeaza dupa 'z' }
  fi, fo : text;
  n, i : longint;
  s, d, c, m : char;
function mindif0 (c : char) : char;{cel mai mic caracter care poate fi folosit}
begin
  if c <> '{' then {poate fi adevarata dupa ce s-a afisat ultimul caracter}
    repeat
		  c := succ(c)
    until (a[c] <> 0) or (c = '{');
  mindif0 := c;
end;
function fMajoritar : char;
var
	cf, m : char;
begin
	m := chr(0);
	for cf := 'a' to 'z' do
  	if 2*a[cf] > n-i+1 then // cf este majoritar
    	begin
    		m := cf; a[m] := 0;            {Ca sa nu poata deveni element curent.}
        c := mindif0 (chr(ord('a')-1));{Nu mai avem nevoie de s si d.}
      end;
  fMajoritar := m;
end;
procedure PanaLaMajoritar;
begin
  write(fo,c);
  dec(a[c]); {cu un caracter mai putin din acest fel}
	if a[c] = 0 then
  	if c = s then
    	begin
      	s := d; d := mindif0(d);
        c := s;
      end
    else
    	begin
    		d := mindif0(d);
      	c := s;
      end
  else
  	if c = s then
    	c := d
    else
    	c := s
end;
procedure DupaMajoritar;
begin
	if odd(n-i+1) then {Trebuie pus m.}
  	write(fo,m)
  else
  	begin
  		write(fo,c);
      dec(a[c]);
      if a[c] = 0 then
      	c := mindif0(c)
    end
end;
begin
	assign(fi,'ordine.in'); reset(fi);
  assign(fo,'ordine.out'); rewrite(fo);
	while not eoln(fi) do
  	begin
  		read(fi,c);
      inc(a[c]);
      inc(n);
    end;
  s := mindif0 (chr(ord('a')-1)); d := mindif0(s); c := s;
  for i := 1 to n do
  	begin
  		m := fMajoritar;
  		if m = chr(0) then
    		PanaLaMajoritar
	    else
  	  	DupaMajoritar;
    end;
  close(fi); close(fo);
end.