問題文
https://atcoder.jp/contests/abc354/tasks/abc354_e
bitDP を使う発想
残っているカードの集合を $S$ としたときに $\mathrm{dp}[S]$ が true の場合、その手番の人は勝つルートが必ずある。 false の場合、その手番の人は勝てるルートがない。というdpを考える。
一つだけ必ず自明な答えがあってカードの集合が0枚のときはその手番の人は必ず負ける。
なので集合のbitを0からスタートして 1<<n まで見ていくのがよさそう。
実装について考える。
以降 bit をカードの集合として考える。
カード i j を選んで bit から i桁目とj桁目を0にした値を 'bit とすると $\mathrm{dp}('bit)= false$ なら bit の手番だと必ず勝てることになる。
つまり自分に選択権があり、iのカードとjのカードを選べば相手詰ませる選択ができるよ!ということ。
少しだけ実装がややこしいので
カード
ijを選んでbitから i桁目とj桁目を0にした値を'bit
この部分だけ明確に書く。
if(!dp[bit ^ 1<<i ^ 1<<j]) now = true;
XOR を使って楽に実装している。