Problem:
ヘビ

ある世界には，文字だけでできた不思議なヘビが住んでいます。このヘビには現在A種とB種の2種類が確認されていますが、それ以外の種類がいる可能性もあります。

A種は，">'"の後に"="が1個以上並んだ後、"#"が来て、さらに前と同じ個数の"="が来た後、"~"（半角チルダ）で終わります。

B種は，">^"の後に "Q="が1個以上並んだ後、"~~"で終わります。

A種の例： >'====#====~ >'==#==~

B種の例： >^Q=Q=Q=Q=~~ >^Q=Q=~~

ヘビを文字列データとして受け取り、それがどんな種類であるかを判別して、A種の場合は「A」、B種の場合は「B」、それ以外の種類の場合は「NA」を出力するプログラムを作成してください。

Input

入力は以下の形式で与えられます。

n
S1
S2
:
Sn

1 行目に判別されるヘビの数 n（1 ≤ n ≤ 10000）、続く n 行に i 匹目のヘビを表す文字列 Si (200文字以下の、空白を含まない文字列) がそれぞれ１行に与えられます。

Output

i 行目に i 匹目のヘビの種類 A、B または NA を出力してください。

Sample Input

3
>'======#======~
>^Q=Q=Q=Q=Q=Q=Q=Q=Q=~~
>'===#====~

Output for the Sample Input

A
B
NA

Solution in Haskell (judge verdict: Accepted)

import Control.Monad

main :: IO ()
main = do
  n <- readLn
  ls <- replicateM n getLine
  mapM_ putStrLn $ solve ls

solve :: [String] -> [String]
solve = map check
  where
    check :: String -> String
    check (x:y:r)
      | x /= '>' = "NA"
      | y == '\'' = checkA r
      | y == '^' = checkB r
      | otherwise = "NA"
      where
        checkA :: String -> String
        checkA s
          | s == [] = "NA"
          | last s /= '~' = "NA"
          | s == "#~" = "NA"
          | filter ('=' /=) s /= "#~" = "NA"
          | reverse s' == s' = "A"
          | otherwise = "NA"
          where s' = init s
        checkB :: String -> String
        checkB s
          | s == [] = "NA"
          | (last s /= '~') || ((last . init $ s) /= '~') = "NA"
          | s == "~~" = "NA"
          | checkB2 (init (init s)) = "B"
          | otherwise = "NA"
          where
            checkB2 :: String -> Bool
            checkB2 [] = True
            checkB2 [x] = False
            checkB2 (x:y:r) = (x == 'Q') && (y == '=') && (checkB2 r)