【ABC過去問演習】162 の D 問題

atcoder.jp

D 問題

問題概要

'R', 'G', 'B' の 3 文字からなる長さN の文字列 S が与えられる。次の二つの条件を満たす整数の組 (i,j,k), 1\leq i\lt j\lt k\leq N を求めよ。

  • S_i\neq S_j かつ S_i\neq S_j かつ S_i\neq S_j
  • j-i\neq k-i
解き方

1 つめの条件を満たす整数の組から j-i=k-j を満たすものを除けばよい。

ACしたコード
#include<bits/stdc++.h>
using namespace std;
int main(){
  int leng;
  cin >>leng;
  map<char,long long>rgb;
  string s;
  cin >>s;
  rgb['R']=0,rgb['G']=0,rgb['B']=0;
  for(int i=0;i<leng;i++){
    rgb.at(s.at(i))++;
  }
  long long tmp=0;
  for(int i=0;i<leng-2;i++){
    for(int j=1;i+j+j<leng;j++){
      if((s.at(i)==s.at(i+j)||s.at(i)==s.at(i+2*j))||s.at(i+j)==s.at(i+2*j)){
        continue;
      }
      else{
        tmp++;
      }
    }
  }
  cout <<rgb.at('R')*rgb.at('G')*rgb.at('B')-tmp<<endl;
}
感想

こういう空集合をとるような発想が自然とできるようになりたい。