fun readInt () = valOf (TextIO.scanStream (Int.scan StringCvt.DEC) TextIO.stdIn) fun readStr () = valOf (TextIO.inputLine TextIO.stdIn) fun readNewline () = TextIO.inputLine TextIO.stdIn val () = let val h = readInt () val w = readInt () val _ = readNewline () fun makeGrid () = let val s_s = List.tabulate (h, fn _ => (readStr ())) val grid = Array.tabulate (h, fn _ => Array.array (w, false)) val blacks = ref [] val y = ref 0 in ( List.app (fn s => let val line = String.explode s val x = ref 0 in ( List.app (fn c => ( if c = #"#" then ( Array.update (Array.sub (grid, !y), !x, true); blacks := (!x, !y) :: !blacks ) else ignore (); x := !x + 1 ) ) line; y := !y + 1 ) end ) s_s; blacks := List.rev (!blacks); (grid, !blacks) ) end val (originalGrid, originalBlacks) = makeGrid () fun satisfy dx dy = let val used = Array.tabulate (h, fn _ => Array.array (w, false)) val blacks = ref originalBlacks val satisfied = ref true val need_loop = ref true in ( while !need_loop do let val (x, y) = List.hd (!blacks) in ( blacks := List.tl (!blacks); if Array.sub (Array.sub (used, y), x) then ( ignore () ) else ( let val xx = x + dx val yy = y + dy in if 0 <= xx andalso xx < w andalso 0 <= yy andalso yy < h andalso Array.sub (Array.sub (originalGrid, yy), xx) andalso Array.sub (Array.sub (used, yy), xx) = false then ( Array.update (Array.sub (used, y), x, true); Array.update (Array.sub (used, yy), xx, true) ) else ( need_loop := false; satisfied := false ) end ); if List.length (!blacks) = 0 then need_loop := false else ignore () ) end; !satisfied ) end fun canPainted () = let val dy = ref 0 val satisfied = ref false val need_loop_y = ref true in ( while !need_loop_y do let val dx = ref (if !dy = 0 then 0 else (~w) + 1) val need_loop_x = ref true in ( while !need_loop_x do if ((!dx = 0 andalso !dy = 0) = false) andalso (satisfy (!dx) (!dy)) then ( satisfied := true; need_loop_y := false; need_loop_x := false ) else ( dx := !dx + 1; if w <= !dx then need_loop_x := false else ignore () ); if !need_loop_y then ( dy := !dy + 1; if h <= !dy then need_loop_y := false else ignore () ) else ignore () ) end; !satisfied ) end in if List.length originalBlacks = 0 then print "NO\n" else if canPainted () then print "YES\n" else print "NO\n" end