kurarrr's memooo

主に競プロ備忘録

ARC 064 D - An Ordinary Game

問題概要

英小文字から成る文字列sが与えられる.
両端以外から,その両隣が同じ文字でないならば文字を1つ取り除け,文字が取り除けなくなったら負けというゲームをする.
先手と後手どちらが勝つか.

解法

ゲーム終了時の文字列は"abab..ab" または "abab..aba"となる.
両端の文字は変わらないから,s[0]==s[N-1]なら前者,そうでないなら後者になる.
上の終了時の文字列以外では必ず手があることに注意すると,
(ゲームの手数) = N-(最終文字列)の偶奇がわかる.
ゲームの手数の偶奇によって勝敗が決まるから, if (先頭==終端) xor (Nが偶数) -> 後手勝ち
else -> 先手勝ち となる.

メモ

最終的な文字列->考察できた
手数の偶奇に注目する->できなかった
最終的な文字列を具体的に求めようとしていたのが敗因っぽい.
こういうタイプの問題よく出る気がするので,手数の偶奇に注目するの覚えておこう.

コード

#include "bits/stdc++.h"

#define ALL(g) (g).begin(),(g).end()
#define REP(i, x, n) for(int i = x; i < n; i++)
#define rep(i,n) REP(i,0,n)
#define EXIST(s,e) ((s).find(e)!=(s).end())
#define pb push_back
#define DEBUG false

using namespace std;

using ll = long long;
using P = pair<int,int>;
using Pl = pair<int,ll>;

const int mod=1e9+7,INF=1<<30;
const double EPS=1e-12,PI=3.1415926535897932384626;
const ll LINF=1LL<<60;
const int MAX_N = 2003;
const ll lmod = 1e9+7;

int main(){
  string s; cin >> s; int N = s.size();
  cout << ((N%2==0 ^ s[0]==s[N-1]) ? "Second" : "First") << endl;
  return 0;
}