Problem:
Score : 400 points

Problem Statement

We have a string S of length N consisting of R, G, and B.

Find the number of triples (i,~j,~k)~(1 \leq i < j < k \leq N) that satisfy both of the following conditions:

S_i \neq S_j, S_i \neq S_k, and S_j \neq S_k.

j - i \neq k - j.

Constraints

1 \leq N \leq 4000

S is a string of length N consisting of R, G, and B.

Input

Input is given from Standard Input in the following format:

N
S

Output

Print the number of triplets in question.

Sample Input 1

4
RRGB

Sample Output 1

1

Only the triplet (1,~3,~4) satisfies both conditions. The triplet (2,~3,~4) satisfies the first condition but not the second, so it does not count.

Sample Input 2

39
RBRBGRBGGBBRRGBBRRRBGGBRBGBRBGBRBBBGBBB

Sample Output 2

1800

Solution in Java (OpenJDK 11.0.6) (judge verdict: Wrong Answer)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;

public class Main {
    public static void main(String[] args){
        try{
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            int n=Integer.parseInt(br.readLine());
            String ss=br.readLine();
            char[] c=ss.toCharArray();
            int ans=0;
            int[][] arr=new int[3][n];
            int r=0,g=0,b=0;
            HashSet<Integer> R=new HashSet<>(),G=new HashSet<>(),B=new HashSet<>();
            for(int i=n-1;i>=0;i--){
                if(c[i]=='R'){
                    r++;
                    R.add(i);
                }else if(c[i]=='G'){
                    g++;
                    G.add(i);
                }else{
                    b++;
                    B.add(i);
                }
                arr[0][i]=r;
                arr[1][i]=g;
                arr[2][i]=b;
            }
            for(int i=0;i<n;i++){
                for(int j=i+1;j<n-1;j++){
                    if(c[i]==c[j]){
                        continue;
                    }
                    int u=j+(j-i);
                    if((c[i]=='R' && c[j]=='G') || (c[i]=='G' && c[j]=='R')){
                        ans+=arr[2][j+1];
                        if(B.contains(u)){
                            ans--;
                        }
                    }else if((c[i]=='R' && c[j]=='B') || (c[i]=='B' && c[j]=='R')){
                        ans+=arr[1][j+1];
                        if(G.contains(u)){
                            ans--;
                        }
                    }else if((c[i]=='G' && c[j]=='B') || (c[i]=='B' && c[j]=='G')){
                        ans+=arr[0][j+1];
                        if(R.contains(u)){
                            ans--;
                        }
                    }
                }
            }

            System.out.println(ans);

        }catch(Exception e){
            System.out.println("KKKK "+e.getMessage());
        }
    }
    static int gcd(int a,int b){
        if(a==0){
            return b;
        }
        if(b==0){
            return a;
        }
        if(a>b){
            return gcd(a%b,b);
        }
        return gcd(a,b%a);

    }
}