B1. Palindrome Game (easy version) #721 Div.2


https://codeforces.com/contest/1527/problem/B1
1秒、256 MBメモリ
input :
  • t (1≤t≤103)
  • n (1≤n≤103)
  • string s of length n
  • output :
  • For each test case print a single word in a new line:
    "ALICE", if Alice will win the game,
    "BOB", if Bob will win the game,
    "DRAW", if the game ends in a draw.
  • 各テストケースで、次のいずれかの単語を出力します.
    Alicが勝ったら「ALICE」、Bobが勝ったら「BOB」、引き分けたら「DRAW」を出力します.
    条件:

  • Both players take alternate turns with Alice going first.
    プレイヤーたちは交代で遊ぶ.先制攻撃はアリスが取った

  • Choose any i (1≤i≤n), where s[i]= '0' and change s[i] to '1'. Pay 1 dollar.iポイントの代わりに1ドルを支払う.

  • Reverse the whole string, pay 0 dollars. This operation is only allowed if the string is currently not a palindrome, and the last operation was not reverse.
    文字列を反転します.この条件は、文字列が返信文でない場合にのみ使用できます.そして相手の行動はreverseではない.
  • 問題で入力した文字列は基本的にパリンドロンです.
    初めて近づいた時、パリンドロンじゃなかったら、ひっくり返せばいいんじゃないですか?と思います.しかし、ベストマッチを行うためには、初めてアリスが1を置いて、ボブも1を置いてください.どこですか.アリスが置いた位置の正しい反対側に
    そして最後のコマが残った時、そのラウンドで行動した人はひっくり返されます.このようにするのが最善の方法だ.
    例外はファリン症候群で,中間に位置する値は0であった.この場合、文字列の長さは奇数であるべきです.
    自分で確認しようとする前に、まずどの行動が最適な数なのかを考えなければなりません.
    だからとにかくアリスが先に攻撃する入力した文字列は、次の2つのケースに分けられます.
    1.ゼロの個数が奇数
    2.0偶数
    次のように分けることができます.

    奇数


    文字列の長さが奇数で、真ん中の文字がゼロという意味です.
    例:
    10001の場合
    Alice:1011(依然としてファリン症候群を引き起こす)
    Bob : 11101
    Alice:10111(逆に自分が勝つ)
    Bob : 11111
    ->Alice勝
    だから奇数ならアリスは勝つしかない.
    例外的に、中間の要素が0の場合、Aliceは失敗します.
    1番の条件が動き出すと、ゲームは続かないからだ.

    偶数


    0000
    Alice : 1000
    Bob : 1001
    Alice : 1101
    Bob:101(逆に自分が勝つ)
    Alice : 1111
    こうして修行して、ボブは勝利した.
    import sys
    
    t = int(sys.stdin.readline())
    for i in range(t):
      n = int(sys.stdin.readline())
      data = sys.stdin.readline().rstrip()
      cnt = 0
    
      for item in data:
          if item == '0':
              cnt += 1
      if cnt == 1 or cnt % 2 == 0:
          print("BOB")
      else:
          print("ALICE")