const b: array [1..28] of string[5] = ('(0)','(1)','not1','not0', '0and0','0and1','1and0','1and1','0or0','0or1','1or0','1or1', '0=>0','0=>1','1=>0','1=>1','0<=>0','0<=>1','1<=>0','1<=>1', '0|0','0|1','1|0','1|1','0^0','0^1','1^0','1^1'); {що} c: string ='0101000101111101100111101000'; {на що міняємо} d: array [1..28] of byte = (2,2,3,3,4,4,4,4,3,3,3,3,3,3,3,3,4,4,4,4,2,2,2,2,2,2,2,2); {кількість позицій для знищення при заміні} var j,k,l,m,n,n2: longint; a,f,s,s0,v: string; o: text; y: boolean; begin assign(o,'nornal.dat'); reset(o); readln(o,s0); {Зчитування переліку змінних} readln(o,s); {Зчитування запису булевої функції} close(o); n:=length(s0); {Кількість змінних} while pos(' ',s)>0 do delete(s,pos(' ',s),1); { n } n2:=1; for j:=1 to n do n2:=n2*2; { n2=2 } assign(o,'nornal.res'); rewrite(o); y:=false; for j:=0 to n2-1 do {Перебір арґументів} begin v:=s; m:=j; for k:=1 to n do {Визначення арґументів} begin if m mod 2=0 then a[k]:='0' else a[k]:='1'; m:=m div 2 end; {Заміна позначення арґумента на його значення} for k:=1 to n do while pos(s0[k],v)>0 do v[pos(s0[k],v)]:=a[k]; {Знаходження величини функції} repeat for l:=1 to 28 do while pos(b[l],v)>0 do begin k:=pos(b[l],v); v[k]:=c[l]; delete(v,k+1,d[l]) end; until length(v)=1; if v='1' then begin {Фраґмент запису} f:='('; for k:=1 to n do begin if k>1 then f:=f+' and '; if a[k]='0' then f:=f+'not '; f:=f+s0[k] end; if y then write(o,' or '); write(o,f+')'); y:=true end end; close(o) end.