mini notes

競技プログラミングの解法メモを残していきます。

ARC024 C - だれじゃ

問題:C - だれじゃ

解答:Submission #11167793 - AtCoder Regular Contest 024

解法: s[i : j]をsのi+1文字目からj文字目までの部分文字列とする。マッチングをチェックするのは以下の範囲。

  • s[k : 2k]はs[0 : k]をチェック
  • s[k+1 : 2k+1]はs[0 : k], s[1 : k+1]をチェック
  • ...
  • s[n-k : n]はs[0 : k], s[1 : k+1], ..., s[n-2k : n-k]をチェック

調査対象は先頭から増えてゆくものの、s[0 : k]が最初にチェックされるのはs[k : 2k]のときである。よって次のようなやり方でチェックを行うとよい。

  • チェック対象は文字列の順番が関係ないので、「各文字が何文字あるか」のvector自体をチェック対象にする
  • s[0 : k]から先にqueueに入れておき、調査対象となる文字列でqueueからsetに入れる
  • setに調査対象と一致するものがあればその時点でYESを出力