AtCoder ABC162 D - RGB Triplets
使用言語は”Java (OpenJDK 11.0.6)”です。
この問題では以下の2つの条件を満たさないといけないですが、両方の条件を満たすものを探していると、パフォーマンス要件で合格が難しいようです。
1つ目の条件を満たす数は、Rの数 × Gの数 × Bの数で求めることが出来るので、そこから2つ目の条件に合わないものを除外することで、両方の条件を満たす結果が得られるようです。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); Integer N = input.nextInt(); char[] S = input.next().toCharArray(); // for condition_1 long r = 0; long g = 0; long b = 0; for (int i = 0; i < N; i++) { if (S[i] == 'R') r++; if (S[i] == 'G') g++; if (S[i] == 'B') b++; } // for condition_2 long result = r * g * b; // 条件1を満たす総数 for (int i = 0; i < N; i++) { for (int j = 1; j < N; j++) { if (i - j >= 0 && i + j < N) { if(S[i] != S[i-j] && S[i] != S[i+j] && S[i-j] != S[i+j]){ result--; // 条件2を満たさないケースを除外していく } } } } System.out.println(result); } }
すっかり数学の知識は忘れてしまっていますが、条件に合わないのを除外するやり方は、確率の計算をするときに似たような考え方していた気がします。