AOJ0139 Snakes

問題リンク Snakes

  • 解法

AかBかを判定するメソッドを気合いで作りました。
判定条件を書き下すように書いたので読みづらいと思います。
DFAを定義してゴニョゴニョした方が良かったかもしれません。

  • ソース
import java.util.Scanner;

//Snakes
public class AOJ0139 {

	static boolean isA(char[] s){
		if(s.length<6)return false;
		if(!(s[0]=='>'&&s[1]=='\''))return false;
		int con = 0;
		while(2+con<s.length && s[2+con]=='=')con++;
		if(con==0)return false;
		if(2+con==s.length||s[2+con]!='#')return false;
		int b = 3+con;
		int sec = 0;
		while(b+sec<s.length && s[b+sec]=='=')sec++;
		if(sec!=con||b+sec==s.length)return false;
		return s[b+sec]=='~'&&b+sec==s.length-1;
	}
	
	static boolean isB(char[] s){
		if(s.length<6)return false;
		if(!(s[0]=='>'&&s[1]=='^'))return false;
		int i = 2;
		int c = 0;
		while(i+1<s.length && s[i]=='Q' && s[i+1]=='='){
			i+=2;c++;
		}
		if(i+1>=s.length||c==0)return false;
		return i+1==s.length-1 && s[i]=='~' && s[i+1]=='~';
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int t = sc.nextInt();
		while(t--!=0){
			char[] s = sc.next().toCharArray();
			System.out.println(isA(s)?"A":isB(s)?"B":"NA");
		}
	}
}