Problem:
A: A-Z Cat / A-Z キャット
物語
あいずにゃんは若ヶ松高校のプログラミングコンテスト部，通称ぷろこん部に所属する2年生である．とてつもなくかわいい．あいずにゃんは友達のジョイに頼まれて猫を預かることになった．A-Z キャットと呼ばれる珍種の猫である．あいずにゃんは預かった A-Z キャットを「あいずにゃん 2 号」と (勝手に) 名付け，大層可愛がった．
A-Z キャットは特定の条件を満たす文字列を好むとされる．そこであいずにゃんが試しに文字列を与えてみると，あいずにゃん 2 号は文字列の一部を爪で切り取った後，満足げな表情を浮かべた．どうやら，好みの文字列に書き換えようとしているようだ．
天使のごとくかわいいあいずにゃんにぞっこんである D のひとは，あいずにゃんのために A-Z キャットが好む文字列の条件を見つけ出した．それは 'A' と 'Z' が交互に繰り返される文字列であり，かつ 'A' から始まり 'Z' で終わる文字列である．A-Z キャットはとても賢いので，最小限の文字消去で好みの文字列に変換しようとする．あいずにゃんにいい格好をしたい D のひとは，与えられた 'A' と 'Z' のみからなる文字列を A-Z キャットがどのような文字列に変換するか求めるプログラムを書くことにした．
問題
英大文字のみからなる文字列
S
が与えられる．
S
の任意の文字を好きなだけ削除することで，'A' と 'Z' が交互に出現し，かつ 'A' から始まり 'Z' で終わる文字列を作る．削除回数を最小化したとき得られる文字列を求めよ．
入力形式
入力として文字列
S
が1行に与えられる．
S
は英大文字のみからなり，
1 ≤ |S| ≤ 20
を満たす．
出力形式
S
に対し最小回数の文字削除を行って得られる，'A' と'Z' が交互に出現し，かつ 'A' から始まり 'Z' で終わる文字列を 1 行に出力せよ．どのような文字削除を行っても条件を満たす文字列が得られない場合は -1 を 1 行に出力せよ．
入力例1
AIZUNYANPEROPERO
出力例1
AZ
入力例2
AZAZ
出力例2
AZAZ
入力例3
ZDDYAZAWABDDZAZPIDDA
出力例3
AZAZAZ
入力例4
ZZZZAAAAAA
出力例4
-1

Submitted solutions:

code_snippet: #include <bits/stdc++.h>
using namespace std;

int main() {
    string s;
    cin >> s;
    int n = (int)s.size();
    int ans = 1e9, opt_mask = -1;
    for (int mask = 0; mask < (1 << n); mask++) {
        string f;
        int cnt = 0;
        for (int i = 0; i < n; i++) {
            if ((mask >> i) & 1) {
                f += s[i];
            } else {
                cnt++;
            }
        }
        if (f.size() < 2) {
            continue;
        }
        if (f[0] != 'A' || f[f.size() - 1] != 'Z') {
            continue;
        }
        bool f1 = true;
        for (int i = 0; i < f.size(); i += 2) {
            if (f[i] != 'A') {
                f1 = false;
                break;
            }
        }
        bool f2 = true;
        for (int i = 1; i < f.size(); i += 2) {
            if (f[i] != 'Z') {
                f2 = false;
                break;
            }
        }
        if (f1 && f2 && ans > cnt) {
            ans = cnt;
            opt_mask = mask;
        }
    }
    if (ans == 1e9) {
        cout << -1 << '\n';
        return 0;
    }
    string t;
    for (int i = 0; i < n; i++) {
        if ((opt_mask >> i) & 1) {
            t += s[i];
        }
    }
    cout << t << '\n';
}
accuracy: 1
time_ms: 220
memory_kb: 3220
final_rank: 3

code_snippet: #include<iostream>

int main() 
{
  std::string nyuroku;
  std::cin >> nyuroku;
  
  int sakujo = 1111;
  std::string kotae = "aaa";
  for(int joutai=0;joutai<(1<<(int)nyuroku.size());joutai++)
    {
      std::string mozi="";
      for(int koko=0;koko<nyuroku.size();koko++)
	{
	  if( (joutai>>koko) & 1 ) 
	    mozi += nyuroku[koko];
	}
      if( mozi.size() <= 1 ) continue;
      if( mozi[0] != 'A' ) continue;
      if( mozi[(int)mozi.size()-1] != 'Z' ) continue;
      int _114514 = 1919;
      char AZ = 'A';
      for(int koko=0;koko<mozi.size();koko++)
	{
	  if( mozi[koko] != AZ ) 
	    {
	      _114514 = -1214;
	      break;
	    }
	  if( AZ == 'A' ) AZ = 'Z';
	  else            AZ = 'A';
	}
      int nagasa = (int)nyuroku.size() - (int)mozi.size();
      if( _114514 == 1919 && sakujo > nagasa )
	{
	  sakujo = nagasa;
	  kotae = mozi;
	}
    }
  if( kotae == "aaa" ) std::cout << -1 << std::endl;
  else                 std::cout << kotae << std::endl;
  return 0;
}
accuracy: 1
time_ms: 320
memory_kb: 1196
final_rank: 1

code_snippet: #include<bits/stdc++.h>

#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)

using namespace std;

bool isValid(string s){
  if( s.size() < 2 ) return false;
  if( s[0] != 'A' || s[(int)s.size()-1] != 'Z' ) return false;
  bool phase = true;
  rep(i,s.size()) {
    if( !( s[i] == 'A' || s[i] == 'Z' ) ) return false;
    if(  phase && s[i] == 'Z' ) return false;
    if( !phase && s[i] == 'A' ) return false;
    phase = !phase;
  }
  return true;
}

int main(){
  string s;
  cin >> s;
  int mini = 100;
  string answer = "-1";
  rep(bitmask,(1<<(int)s.size())){
    string tmp="";
    rep(i,s.size()) if( (bitmask>>i) & 1 ) tmp += s[i];
    int cost = (int)s.size() - (int)__builtin_popcount(bitmask);
    if( cost >= mini ) continue;
    if( isValid(tmp) ) {
      if( cost < mini ) { 
	mini = cost;
	answer = tmp;
      }
    }
  }
  cout << answer << endl;
  return 0;
}
accuracy: 1
time_ms: 400
memory_kb: 1196
final_rank: 2

code_snippet: #include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>

#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)

using namespace std;

bool check(string s) {
  if( s.size() < 2 ) return false;
  bool phase = false; // f --> A, t --> Z
  rep(i,s.size()){
    if( s[i] != 'A' && s[i] != 'Z' ) return false;
    if( !phase && s[i] != 'A' ) return false;
    if(  phase && s[i] != 'Z' ) return false;
    phase = !phase;
  }
  if( s[0] != 'A' || s[(int)s.size()-1] != 'Z' ) return false;
  return true;
}

int main(){
  string s;
  cin >> s;
  int len = s.size();
  string ans = "";
  rep(i,(1<<len)){
    string t = "";
    rep(j,len) if( (i>>j) & 1 ) t += string(1,s[j]);
    if( check(t) ) {
      if( ans.size() < t.size()  ) ans = t;
    }
  }
  if( ans.empty() ) puts("-1");
  else cout << ans << endl;
  return 0;
}
accuracy: 1
time_ms: 820
memory_kb: 1192
final_rank: 3