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.