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 C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace Test1 {





    class ClassMain {


        public static bool isA(string str) {
            char[] chrs = str.ToCharArray();
            int phase = 0;
            int count = 0;
            if(chrs.Length<6){return false;}
            for (int i = 0; i < chrs.Length; i++) {
                if (phase == 0) {
                    if (chrs[0] != '>' || chrs[1] != '\'') { return false; }
                    i++;
                    phase = 1;
                }
                else if (phase == 1) {
                    if (chrs[i] == '#') {
                        if (count == 0) { return false; }
                        else {
                            phase = 2;
                            continue;
                        }
                    }
                    if (chrs[i] != '=') { return false; }
                    else { count++; }
                }
                else if (phase == 2) {
                    if (chrs[i] != '=') { return false; }
                    else { 
                        count--;
                        if (count == 0) { phase = 3; }
                    }
                }
                else if (phase == 3) {
                    if (chrs[i] == '~' && i == chrs.Length - 1) { return true; }
                    else { return false; }
                }
            }
            return false;
        }

        public static bool isB(string str) {
            char[] chrs = str.ToCharArray();
            int phase = 0;
            int count = 0;
            if (chrs.Length < 6) { return false; }
            for (int i = 0; i < chrs.Length; i++) {
                if (phase == 0) {
                    if (chrs[0] != '>' || chrs[1] != '^') { return false; }
                    i++;
                    phase = 1;
                }
                else if (phase == 1) {
                    if (chrs[i] == 'Q'&&chrs[i+1]=='=') {
                        count++;
                        i++;
                        continue;
                    }
                    if (chrs[i] == '~'&&chrs[i+1]=='~') { 
                        return (count>0); 
                    }
                    else { return false; }
                }
            }
            return false;
        }

        public static void Main(String[] args) {
            string line;
            while ((line = Console.ReadLine()) != null) {
                int n = int.Parse(line);
                if (n == 0) { break; }
                for (int i = 0; i < n; i++) {
                    line = Console.ReadLine();
                    if (isA(line)) { Console.WriteLine("A"); }
                    else if (isB(line)) { Console.WriteLine("B"); }
                    else { Console.WriteLine("NA"); }
                }
                break;


            }
        }
    
    }



    
}