program jiapu; var ch:char; st,h:string; w,re,ww:array[0..50002]of string; f:array[0..50000]of longint; i,j,k,now,xw,n,m,x,y,dd:longint; procedure kp(l,r:longint); var i,j,k:longint;mid,t:string; begin i:=l;j:=r;mid:=re[(i+j)div 2]; repeat while re[i]<mid do inc(i); while re[j]>mid do dec(j); if i<=j then begin t:=re[i];re[i]:=re[j];re[j]:=t; inc(i);dec(j); end; until i>j; if i<r then kp(i,r); if j>l then kp(l,j); end; function get(x:longint):longint; begin if f[x]=x then exit(x); get:=get(f[x]); f[x]:=get; end; function find(x:string):longint; var l,r,mid:longint; begin mid:=dd;l:=1;r:=k; while re[mid]<>x do begin if re[mid]>x then r:=mid-1; if re[mid]<x then l:=mid+1; mid:=(l+r)div 2; end; find:=mid; end; begin readln(w[1]); for i:=1 to 50000 do f[i]:=i; i:=1; while w[i][1]<>'?' do begin ww[i]:=w[i]; delete(w[i],1,1); inc(i); readln(w[i]); end; h:=w[i]; dec(i); for j:=1 to i-1 do for k:=j+1 to i do if w[j]=w[k] then w[j]:=' '; k:=0; for j:=1 to i do if w[j]<>' 'then begin inc(k); re[k]:=w[j]; end; kp(1,k); dd:=(1+k)div 2; j:=1; while j<=i do begin now:=j+1; delete(ww[j],1,1); m:=find(ww[j]);x:=get(m); while ww[now][1]='+' do begin delete(ww[now],1,1); n:=find(ww[now]); f[n]:=x; inc(now); end; j:=now; end; st:=h; while st[1]<>'$'do begin delete(st,1,1); x:=f[find(st)]; writeln(st,' ',re[x]); readln(st); end; end. /************************************************************** Problem: 2236 User: admin Language: Pascal Result: Wrong Answer ****************************************************************/