http://acm.pku.edu.cn/JudgeOnline/problem?id=1114
Код:
type data=array['A'..'Z','a'..'{']of integer; procedure clear(var d:data); var c1,c2:char; begin for c1:='A' to 'Z' do for c2:='a' to '{' do d[c1,c2]:=0; end; procedure mul(var d:data;n:integer); var c1,c2:char; begin for c1:='A' to 'Z' do for c2:='a' to '{' do d[c1,c2]:=d[c1,c2]*n; end; procedure add(var d1,d2:data); var c1,c2:char; begin for c1:='A' to 'Z' do for c2:='a' to '{' do d1[c1,c2]:=d1[c1,c2]+d2[c1,c2]; end; function eq(var d1,d2:data):boolean; var c1,c2:char; begin eq:=false; for c1:='A' to 'Z' do for c2:='a' to '{' do if d1[c1,c2]<>d2[c1,c2] then exit; eq:=true; end; procedure ie(id:string); begin writeln('internal error: ',id); halt(1); end; var s:string; pos:integer; c:char; procedure nextChar; begin inc(pos); if pos<=length(s) then begin c:=s[pos]; {write(c);} end else begin c:=#13; dec(pos); end; end; procedure numberopt(var n:integer); begin if c in ['1'..'9'] then begin n:=0; while c in ['0'..'9'] do begin n:=n*10+ord(c)-ord('0');{no check} nextChar; end; end else n:=1; end; procedure chem(var d:data); var c1,c2:char; begin if c in ['A'..'Z'] then begin c1:=c; nextChar; end else ie('chem'); if c in ['a'..'z'] then begin c2:=c; nextChar; end else c2:='{'; clear(d); d[c1,c2]:=1; end; procedure sequence(var d:data);forward; procedure elem(var d:data); begin if c in ['A'..'Z'] then chem(d) else if c='(' then begin nextChar; sequence(d); if c=')' then nextChar else ie('elem1'); end else ie('elem2'); end; procedure sequence(var d:data); var m:integer; d2:^data; begin elem(d); numberopt(m); mul(d,m); while c in ['A'..'Z','('] do begin new(d2); elem(d2^); numberopt(m); mul(d2^,m); add(d,d2^); dispose(d2); end; end; procedure formula(var d:data); var m:integer; d2:^data; begin numberopt(m); sequence(d); mul(d,m); while c='+' do begin nextChar; numberopt(m); new(d2); sequence(d2^); mul(d2^,m); add(d,d2^); dispose(d2); end; end; procedure parse(s0:string;var d:data); begin s:=s0; pos:=0; nextChar; formula(d); if c<>#13 then ie('parse'); end; var left,right:string; i,n:integer; ldata,rdata:data; begin readln(left); parse(left,ldata); readln(n); for i:=1 to n do begin readln(right); parse(right,rdata); if eq(ldata,rdata) then writeln(left,'==',right) else writeln(left,'!=',right); end; end.