AOJ 0139 Snakes

問題

A種の例: >'====#====~        >'==#==~
B種の例: >^Q=Q=Q=Q=~~        >^Q=Q=~~

提出

追記:2020/01/04

code

// >'======#======~
bool is_pattern_A(string s){
  ll L = s.size();
  // check tail
  if(s.back()!='~') return false;
  string body = s.substr(2, L-3);
  if(body.size()%2==0) return false;
  ll c = body.size()/2;
  if(body[c]!='#') return false;
  map<char, ll> mp;
  for(char c : body){
    mp[c]++;
  }
  if(mp['=']>0 && mp['=']==body.size()-1 && mp['#']==1){
    return true;
  }else{
    return false;
  }
}

bool is_pattern_B(string s){
  ll L = s.size();
  string tail = s.substr(L-2);
  if(tail!="~~") return false;
  string body = s.substr(2, L-4);
  if(body.size()==0) return false;
  if(body.size()%2==1) return false;
  for(int i=0; i<body.size(); i+=2){
    if(body[i]=='Q' && body[i+1]=='='){
      // ok
    }else{
      return false;
    }
  }
  return true;
}

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);

    // input
    ll N; 
    cin >> N;

    rep(i, N){
      string s;cin>>s;
      if(s.size()==1){
        p("NA");
        continue;
      }
      string head = s.substr(0, 2);
      if(head==">'"){
        if(is_pattern_A(s)){
          p("A");
        }else{
          p("NA");
        }
      }
      else if(head==">^"){
        if(is_pattern_B(s)){
          p("B");
        }else{
          p("NA");
        }
      }
      else{
        p("NA");
      }
    }
    
    return 0;
}