type list = ^node; node = record s : string; next : list; end; lstArr = array [0 .. 1] of list; procedure append(var L : list; s : string); var p, last : list; begin new(p); p^.next := nil; p^.s := s; if L = nil then L := p else begin last := L; while last^.next <> nil do last := last^.next; last^.next := p; end; end; const lst : lstArr = (nil, nil); var len : integer; procedure split(s : string); var p : integer; procedure appends(s : string); var p : integer; begin inc(len); p := pos('+', s); append(lst[0], copy(s, 1, p - 1)); append(lst[1], copy(s, p+1, length(s) - p)); end; begin p := pos(',', s); if p = 0 then appends(s) else begin appends( copy(s, 1, p - 1) ); split( copy(s, p + 1, length(s) - p) ); end; end; procedure print_lists(count : integer; L : lstArr); var Ls : lstArr; Cycle : Integer; procedure printInner(Divider : integer); var i : Integer; begin if Divider > 0 then begin write(Ls[(Cycle div Divider) mod 2]^.s, ' '); for i := 0 to 1 do Ls[ i ] := Ls[ i ]^.next; printInner(Divider div 2); end else writeln; end; begin for Cycle := 0 to Count - 1 do begin Ls := L; printInner(Count div 2); end; end; var s : string; begin len := 0; s := 'A+B,A+C,D+F'; split(s); print_lists(1 shl len, lst); { delete lists } readln; end.