Buggy python submission (verdict: Time Limit Exceeded):
import bisect

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

'''
R_index = list()
G_index = list()
B_index = list()

for i in range(N):
    if S[i] == "R":
        R_index.append(i+1)
    elif S[i] == "G":
        G_index.append(i+1)
    if S[i] == "B":
        B_index.append(i+1)
'''

#組 (i, j, k) (1≤i<j<k≤N) の数を求めてください。
#Si≠Sj かつ Si≠Sk かつ Sj≠Sk である
#j−i≠k−jの条件下で組み合わせる
#j−i=k−j → 2j−i=kはNGということ。
ans = 0

#愚直解
#for R in R_index:
#    for G in G_index:
#        for B in B_index:
#            #この段階で文字の不一致はクリア
#            #並べ方はRGB,RBG,GRB,GBR,BGR,BRGの6パターン
#            for comb in [(R,G,B),(R,B,G),(G,R,B),(G,B,R),(B,G,R),(B,R,G)]:
#                i = comb[0]
#                j = comb[1]
#                k = comb[2]

#                if j - i !=  k - j and i < j and j < k:
#                    ans += 1

#高速解
#文字の並べ方 6通り
#i,jの選び方 2**10**6

for i in range(0,N-2):
    for j in range(i+1,N-1):
        if S[i]!=S[j]:
            for k in range(j+1,N):
                if j-i != k-j and S[i]!=S[k] and S[j]!=S[k]:
                    #print(i,j,k,S[i],S[j],S[k])
                    ans += 1

'''
for R in R_index:
    #RGBのパターン
    OK_G = G_index[bisect.bisect_right(G_index,R):]
    for G in OK_G:
        OK_B = B_index[bisect.bisect_right(B_index,G):]
        ans += len(OK_B)
        if 2*G - R in set(OK_B):
            ans -= 1
    #RBGのパターン
    OK_B = B_index[bisect.bisect_right(B_index,R):]
    for B in OK_B:
        OK_G = G_index[bisect.bisect_right(G_index,B):]
        ans += len(OK_G)
        if 2*B - R in set(OK_G):
            ans -= 1

for G in G_index:
    #GRBのパターン
    OK_R = R_index[bisect.bisect_right(R_index,G):]
    for R in OK_R:
        OK_B = B_index[bisect.bisect_right(B_index,R):]
        ans += len(OK_B)
        if 2*R - G in set(OK_B):
            ans -= 1
    #GBRのパターン
    OK_B = B_index[bisect.bisect_right(B_index,G):]
    for B in OK_B:
        OK_R = R_index[bisect.bisect_right(R_index,B):]
        ans += len(OK_R)
        if 2*B - G in set(OK_R):
            ans -= 1    

for B in B_index:
    #BGRのパターン
    OK_G = G_index[bisect.bisect_right(G_index,B):]
    for G in OK_G:
        OK_R = R_index[bisect.bisect_right(R_index,G):]
        ans += len(OK_R)
        if 2*G - B in set(OK_R):
            ans -= 1
    #BRGのパターン
    OK_R = R_index[bisect.bisect_right(R_index,B):]
    for R in OK_R:
        OK_G = G_index[bisect.bisect_right(G_index,R):]
        ans += len(OK_G)
        if 2*R - B in set(OK_G):
            ans -= 1    
'''

print(ans)

Fixed submission:
N = int(input()) #<=4000
S = list(input())

R_index = list()
G_index = list()
B_index = list()

for i in range(N):
    if S[i] == "R":
        R_index.append(i+1)
    elif S[i] == "G":
        G_index.append(i+1)
    if S[i] == "B":
        B_index.append(i+1)

#組 (i, j, k) (1≤i<j<k≤N) の数を求めてください。
#Si≠Sj かつ Si≠Sk かつ Sj≠Sk である
#j−i≠k−jの条件下で組み合わせる
#j−i=k−j
#↓
#2j−i=k ≡ 2j−k=i  ≡ (i+k)/2 = j はNGということ。

ans = len(R_index)*len(G_index)*len(B_index) #まず全通りを計算
B_set = set(B_index)

#NG分を除去する
for R in R_index:
    for G in G_index:
        #R,G,Bのi,j,kへのあてはめ方は6通り。大小関係にも注意
        #(R,G,B),(R,B,G),(G,B,R),(G,R,B),(B,R,G),(B,G,R)
        if (R+G)/2 in B_set:
            ans -= 1
        if 2*G-R in B_set:
            ans -= 1
        if  2*R-G in B_set:
            ans -= 1
        
print(ans)