Pagini recente » Cod sursa (job #1464751) | Istoria paginii runda/oji_go_11_12_2/clasament | Cod sursa (job #1557366) | Cod sursa (job #1602854) | Cod sursa (job #111870)
Cod sursa(job #111870)
var
a : array ['a'..'{'] of longint; { acolada urmeaza dupa 'z' }
fi, fo : text;
n, i : longint;
s, d, c, m : char;
majoritar : boolean;
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); //if c = '{' then repeat until false;
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; majoritar := false;
for i := 1 to n do
if majoritar then
DupaMajoritar
else
begin
m := fMajoritar;
if m = chr(0) then
PanaLaMajoritar
else
begin
majoritar := true;
DupaMajoritar;
end
end;
close(fi); close(fo);
end.