C - Prefix and Suffix 解説 by AngrySadEight

ビット演算により出力の場合分けを減らす方法

この問題では,「\(S\)\(T\) の接頭辞か」「\(S\)\(T\) の接尾辞か」のそれぞれの組合せに対して異なる出力結果を返す必要があり,地道に場合分けすると少しだけ面倒です.

出力する値をよく観察しましょう.すると,次のことがわかります.

  • 出力する値は,「\(S\)\(T\) の接頭辞か」を上位ビット,「\(S\)\(T\) の接尾辞か」を下位ビットとする,\(2\) ビットの値として表されている.
  • 上位ビットが立っていることは,\(S\)\(T\) の接頭辞ではないことを表している.
  • 下位ビットが立っていることは,\(S\)\(T\) の接尾辞ではないことを表している.

ビットが立っていることが,接頭辞/接尾辞ではないことに対応することに注意してください.

これにより,\(b_1=\)\(S\)\(T\) の接頭辞であるとき \(0\),ないとき \(1\)),\(b_2=\)\(S\)\(T\) の接尾辞であるとき \(0\),ないとき \(1\))とおくと,答えは \(2b_1 + b_2\) と,一つの式だけで表すことができます.

投稿日時:
最終更新: