- // posted as http://c...content-available-to-author-only...e.com/a/23442/16293 
- import java.util.*;class-  S {public static void-  main (String[]- a ){new-  S ();}int-  a ;int[][]- f ;- List <- L >- l ;- Stack <- Integer >- b ;- S (){- Scanner s =new-  Scanner (System- . in);- a =- s. nextInt();- f =new int[- a ][- a ];for(int[]- x :- f )Arrays- . fill(- x, 95);- s. next(";");- b =new Stack();for(int-  i =1;- s. hasNextInt();- i ++){- b. addAll(Collections- . nCopies(- s. nextInt()- ,i ));}- s. next(";");while(- s. findInLine("([A-Z])")!=null)- f [- s. match()- . group(1)- . charAt(0)-65][- s. nextInt()-1]=79;- l =new ArrayList();for(int-  i =0;- i <- a ;- i ++){- l. add(new-  L (- i ){int-  g (int-  c ){return-  g (- c,i );}void-  s (int-  c, int-  v ){- f [- c ][- i ]=- v ;}});- l. add(new-  L (- i ){int-  g (int-  r ){return-  g (- i,r );}void-  s (int-  r, int-  v ){- f [- i ][- r ]=- v ;}});}if(- s ()){String-  o ="";for(int-  r =0;- r <- a ;- r ++){for(int-  c =0;- c <- a ;- c ++)- o +=(char)- f [- c ][- r ];- o +='\n';}System- . out- . print(- o );}}boolean-  s (){if(- b. empty())return true;int-  s =- b. pop();Integer-  n =95;for(- L c :- l ){int-  f =0;for(int-  x =0;- x <- a ;- x ++){if(- n. equals(- c. g(- x )))- f ++;else-  f =0;if(- f >=- s ){for(int-  i =0;- i <- s ;- i ++)- c. s(- x -- i, 35);if(- s ())return true;for(int-  i =0;- i <- s ;- i ++)- c. s(- x -- i,n );}}}- b. push(- s );return false;}class-  L {int-  i ;- L (int-  v ){- i =- v ;}void-  s (int-  i, int-  v ){}int-  g (int-  i ){return 0;}int-  g (int-  c, int-  r ){int-  v =0;for(int-  x =-1;- x <2;- x ++)for(int-  y =-1;- y <2;- y ++)try{- v |=- f [- c +- x ][- r +- y ];}catch(Exception-  e ){}return-  v &(- f [- c ][- r ]|32);}}}
 
				Ly8gcG9zdGVkIGFzIGh0dHA6Ly9jLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbS9hLzIzNDQyLzE2MjkzCmltcG9ydCBqYXZhLnV0aWwuKjtjbGFzcyBTe3B1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdYSl7bmV3IFMoKTt9aW50IGE7aW50W11bXWY7TGlzdDxMPmw7U3RhY2s8SW50ZWdlcj5iO1MoKXtTY2FubmVyIHM9bmV3IFNjYW5uZXIoU3lzdGVtLmluKTthPXMubmV4dEludCgpO2Y9bmV3IGludFthXVthXTtmb3IoaW50W114OmYpQXJyYXlzLmZpbGwoeCw5NSk7cy5uZXh0KCI7Iik7Yj1uZXcgU3RhY2soKTtmb3IoaW50IGk9MTtzLmhhc05leHRJbnQoKTtpKyspe2IuYWRkQWxsKENvbGxlY3Rpb25zLm5Db3BpZXMocy5uZXh0SW50KCksaSkpO31zLm5leHQoIjsiKTt3aGlsZShzLmZpbmRJbkxpbmUoIihbQS1aXSkiKSE9bnVsbClmW3MubWF0Y2goKS5ncm91cCgxKS5jaGFyQXQoMCktNjVdW3MubmV4dEludCgpLTFdPTc5O2w9bmV3IEFycmF5TGlzdCgpO2ZvcihpbnQgaT0wO2k8YTtpKyspe2wuYWRkKG5ldyBMKGkpe2ludCBnKGludCBjKXtyZXR1cm4gZyhjLGkpO312b2lkIHMoaW50IGMsaW50IHYpe2ZbY11baV09djt9fSk7bC5hZGQobmV3IEwoaSl7aW50IGcoaW50IHIpe3JldHVybiBnKGkscik7fXZvaWQgcyhpbnQgcixpbnQgdil7ZltpXVtyXT12O319KTt9aWYocygpKXtTdHJpbmcgbz0iIjtmb3IoaW50IHI9MDtyPGE7cisrKXtmb3IoaW50IGM9MDtjPGE7YysrKW8rPShjaGFyKWZbY11bcl07bys9J1xuJzt9U3lzdGVtLm91dC5wcmludChvKTt9fWJvb2xlYW4gcygpe2lmKGIuZW1wdHkoKSlyZXR1cm4gdHJ1ZTtpbnQgcz1iLnBvcCgpO0ludGVnZXIgbj05NTtmb3IoTCBjOmwpe2ludCBmPTA7Zm9yKGludCB4PTA7eDxhO3grKyl7aWYobi5lcXVhbHMoYy5nKHgpKSlmKys7ZWxzZSBmPTA7aWYoZj49cyl7Zm9yKGludCBpPTA7aTxzO2krKyljLnMoeC1pLDM1KTtpZihzKCkpcmV0dXJuIHRydWU7Zm9yKGludCBpPTA7aTxzO2krKyljLnMoeC1pLG4pO319fWIucHVzaChzKTtyZXR1cm4gZmFsc2U7fWNsYXNzIEx7aW50IGk7TChpbnQgdil7aT12O312b2lkIHMoaW50IGksaW50IHYpe31pbnQgZyhpbnQgaSl7cmV0dXJuIDA7fWludCBnKGludCBjLGludCByKXtpbnQgdj0wO2ZvcihpbnQgeD0tMTt4PDI7eCsrKWZvcihpbnQgeT0tMTt5PDI7eSsrKXRyeXt2fD1mW2MreF1bcit5XTt9Y2F0Y2goRXhjZXB0aW9uIGUpe31yZXR1cm4gdiYoZltjXVtyXXwzMik7fX19