aacord’s memo

abcを中心にpythonで解いた問題のメモ、整理をしています。緑になった。

abc162 d(python)

一組ずつ条件に照らし合わせると当然TLEする
Rがa個、Bがb個、Gがc個あるとすると、最大a*b*c個ある。
そこから条件2に当てはらないものを引いていくという方針。
条件2ではじかれるものは
s[i] != s[i+m+1] and s[i+m] != s[i+2*m+2] and s[i+2*m+2] != s[i]
であり、あとはこれの mの範囲とその時の i の範囲がわかれば解ける
例えばサンプル2の n = 39 のときなら 0≤m≤18 となり、m = (n-3)//2 だと予想できる
(m=18 のときに s[0],s[19],s[38] がギリギリ取れる)

追記:そんなことしなくても i < j < l ≤ n で l == j - i + j となるものをさらっていけば良かった

n = int(input())
s = input()
chkR = 0
chkB = 0
chkG = 0
if n == 1 or n==2:
  print(0)
  exit()
  
for i in range(n):
  if s[i] =='R':
    chkR+=1
  if s[i] =='B':
    chkB+=1
  if s[i] =='G':
    chkG+=1
    
ans = chkR*chkB*chkG

m = (n-3)//2
for i in range(m+1):
  for j in range(n-2-2*i):
    if s[j]!=s[j+i+1] and s[j+i+1]!=s[j+2*i+2] and s[j+2*i+2]!=s[j]:
      ans -= 1
      
print(ans)