ntk log ntk

競プロや非競技プロのやったことを書いています.

ABC162 D - RGB Triplets

D - RGB Triplets

解法

文字列から3つ選んだとき, 3つとも異なる文字かつ, (1番目と2番目の添え字の差)と(2番目と3番目の添え字の差)が等しくない組を数え上げたい.

 1 \le N \le 4000なので, 二重ループくらいの処理は許される.
入力例1を紙に書いてみて, 1つ目の'R'は選んでもいいけれど, 2つ目の'R'は選べないのかと気づく.
入力例2が長いので自分でサンプルを作る. "RRRGGB"だったらいくつになるだろうか?
作ってみて気づいた. 条件を満たすように数え上げることより, とりあえず文字が全部違う組を数え上げて, 後から差が等しくなってしまう組を取り除くことのが簡単そうでは? 文字が全て違う組の数は, (Rの個数) \times (Gの個数) \times (Bの個数)である.
差dは1からNまで回してよい. 文字列をSとしたとき, S[i]とS[i+d]とS[i+2*d]が全て異なるなら先に数え上げた組の数から-1する.
提出コード


Pythoncollections.Counterは, 存在しないキーに対して0を返してくれるのが嬉しいです. おかげで'R'か'G'か'B'に存在しない要素があるとき, 答えとして0を出力してくれます.