AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC162-D RGB Triplets
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("4");
WillReturn.Add("RRGB");
//1
}
else if (InputPattern == "Input2") {
WillReturn.Add("39");
WillReturn.Add("RBRBGRBGGBBRRGBBRRRBGGBRBGBRBGBRBBBGBBB");
//1800
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
string S = InputList[1];
long RCnt = S.ToCharArray().Count(pX => pX == 'R');
long GCnt = S.ToCharArray().Count(pX => pX == 'G');
long BCnt = S.ToCharArray().Count(pX => pX == 'B');
long Answer = RCnt * GCnt * BCnt; // 積の法則
int UB = S.Length - 1;
for (int I = 0; I <= UB; I++) {
for (int J = I + 1; J <= UB; J++) {
int K = 2 * J - I;
if (K > UB) break;
char RGB1 = S[I];
char RGB2 = S[J];
char RGB3 = S[K];
if (RGB1 != RGB2 && RGB1 != RGB3 && RGB2 != RGB3) {
Answer--; // 補集合の要素数を引く
}
}
}
Console.WriteLine(Answer);
}
}
解説
最初に、積の法則で
RとGとBの選択する集合の要素数を求める。
次に、上記の集合の内
J - I = K - J を変形した
2 * J - I = K
を満たす分の、要素数を引いてます。