AtCoder Beginner Contest 162 D - RGB Triplets【Python】

https://atcoder.jp/contests/abc162/tasks/abc162_d

AtCoder ProblemsでDifficulty: 757、Solve Probability: 33%でした。

先にR,G,Bそれぞれの数の累積和を求めて、i, jについて全探索してkについては累積和から条件に合う数を求めました。
解説を見たところ、R,G,Bそれぞれの数をかけたものから2つ目の条件のものを引けばよかったようです。

N = int(input())
S = input()

sum_R = [0]
sum_G = [0]
sum_B = [0]
for i in range(N):
    if S[i] == "R":
        sum_R.append(sum_R[i] + 1)
        sum_G.append(sum_G[i])
        sum_B.append(sum_B[i])
    elif S[i] == "G":
        sum_R.append(sum_R[i])
        sum_G.append(sum_G[i] + 1)
        sum_B.append(sum_B[i])
    else:
        sum_R.append(sum_R[i])
        sum_G.append(sum_G[i])
        sum_B.append(sum_B[i] + 1)

ans = 0
for i in range(N):
    for j in range(i+1, N):
        s1 = S[i]
        s2 = S[j]
        ji_diff = j - i
        if (s1 == "R" and s2 =="G") or (s1 == "G" and s2 =="R"):
            ans += sum_B[N] - sum_B[j+1]
            # 2つ目の条件を満たすようにする
            if j + ji_diff < N:
                if S[j+ji_diff] == "B":
                    ans -= 1
        elif (s1 == "R" and s2 =="B") or (s1 == "B" and s2 =="R"):
            ans += sum_G[N] - sum_G[j+1]
            if j + ji_diff < N:
                if S[j+ji_diff] == "G":
                    ans -= 1
        elif (s1 == "G" and s2 =="B") or (s1 == "B" and s2 =="G"):
            ans += sum_R[N] - sum_R[j+1]
            if j + ji_diff < N:
                if S[j+ji_diff] == "R":
                    ans -= 1
print(ans)

解説を見ての実装

N = int(input())
S = input()

num_R = S.count("R")
num_G = S.count("G")
num_B = S.count("B")
All = num_R * num_G * num_B

ans = All
for i in range(N):
    for j in range(i+1, N):
        s1 = S[i]
        s2 = S[j]
        if j + (j - i) >= N:
            continue
        k = j + (j - i)
        s3 = S[k]
        if s1 == s2:
            continue
        if s1 == s3:
            continue
        if s2 == s3:
            continue
        ans -= 1
print(ans)