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 C# (Mono-mcs 6.8.0.105) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AtCoder
{
	class Program
	{
		static void Main(string[] args)
		{
			var n = long.Parse(Console.ReadLine());
			var s = Console.ReadLine();

			var rHashSet = new List<int>();
			var gHashSet = new List<int>();
			var bHashSet = new HashSet<int>();

			for(var i = 0; i < n; i++)
			{
				if(s[i] == 'R')
				{
					rHashSet.Add(i);
				}
				else if (s[i] == 'G')
				{
					gHashSet.Add(i);
				}
				else
				{
					bHashSet.Add(i);
				}
			}

			long count = rHashSet.Count * gHashSet.Count * bHashSet.Count;

			for(var i = 0; i < rHashSet.Count; i++)
			{
				var rIndex = rHashSet.ElementAt(i);

				for(var j = 0; j < gHashSet.Count; j++)
				{
					var gIndex = gHashSet.ElementAt(j);

					if(rIndex < gIndex)
					{
						if(bHashSet.Contains(gIndex + (gIndex - rIndex)))
						{
							count--;
						}
						if(bHashSet.Contains(rIndex - (gIndex - rIndex)))
						{
							count--;
						}
					}
					else
					{
						if (bHashSet.Contains(rIndex + (rIndex - gIndex)))
						{
							count--;
						}
						if (bHashSet.Contains(gIndex - (rIndex - gIndex)))
						{
							count--;
						}
					}

					if((rIndex + gIndex) % 2 == 0)
					{
						if(bHashSet.Contains((rIndex + gIndex) / 2))
						{
							count--;
						}
					}
				}
			}

			Console.WriteLine(count);
		}
	}
}