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 Go (1.14.1) (judge verdict: Time Limit Exceeded)

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func main() {
	nextReader = newScanner()
	_ = nextInt()
	s := nextString()

	m := make(map[rune][]int)
	for i, c := range s {
		m[c] = append(m[c], i)
	}
	ans := 0
	for i, c := range s {
		if c == 'R' {
			ans += solve('G', 'B', m, i)
		}
		if c == 'G' {
			ans += solve('B', 'R', m, i)
		}
		if c == 'B' {
			ans += solve('R', 'G', m, i)
		}
	}
	fmt.Println(ans)
}

func solve(r1, r2 rune, m map[rune][]int, i int) int {
	ans := 0
	for _, j := range m[r1] {
		if i > j {
			continue
		}
		for _, k := range m[r2] {
			if j > k {
				continue
			}
			if j-i != k-j {
				ans++
			}
		}
	}
	for _, j := range m[r2] {
		if i > j {
			continue
		}
		for _, k := range m[r1] {
			if j > k {
				continue
			}
			if j-i != k-j {
				ans++
			}
		}
	}
	return ans
}

// ---------------------------------------------------------------
// I/O
// ---------------------------------------------------------------
var nextReader func() string

func newScanner() func() string {
	sc := bufio.NewScanner(os.Stdin)
	sc.Buffer(make([]byte, 1024), int(1e11))
	sc.Split(bufio.ScanWords)
	return func() string {
		sc.Scan()
		return sc.Text()
	}
}

func nextString() string { return nextReader() }

func nextInt() int { n, _ := strconv.Atoi(nextReader()); return n }

func nextInts(size int) []int {
	ns := make([]int, size)
	for i := 0; i < size; i++ {
		ns[i] = nextInt()
	}
	return ns
}