fun readInt () = valOf (TextIO.scanStream (Int.scan StringCvt.DEC) TextIO.stdIn) fun readStr () = let fun scan reader stream = SOME (StringCvt.splitl (not o Char.isSpace) reader (StringCvt.skipWS reader stream)) in valOf (TextIO.scanStream scan TextIO.stdIn) end exception BadInput fun etoToNum "ne" = 0 | etoToNum "ushi" = 1 | etoToNum "tora" = 2 | etoToNum "u" = 3 | etoToNum "tatsu" = 4 | etoToNum "mi" = 5 | etoToNum "uma" = 6 | etoToNum "hitsuji" = 7 | etoToNum "saru" = 8 | etoToNum "tori" = 9 | etoToNum "inu" = 10 | etoToNum "i" = 11 | etoToNum _ = raise BadInput val () = let val n = readInt () val a_s = List.tabulate (n, fn _ => readStr ()) val table = Array.array (12, 0) fun updateTable i = Array.update (table, i, Array.sub (table, i) + 1) fun processData [] = ignore () | processData (h::tl) = ( updateTable (etoToNum h); processData tl ) val limit = if n mod 2 = 0 then n div 2 else (n + 1) div 2 val ans = ( processData a_s; if Array.exists (fn v => limit < v) table then "NO" else "YES" ) in print (ans ^ "\n") end