# ?の数を数えて、前半何個までをAとするかで全探索したらTLE # 半分前後だけを調べてもWA # 三分探索してみる、ただし最低値を求めるやり方なのでマイナスにして最低値を求める N = int(input()) S = input() q_count = S.count('?') if q_count == 0: ans = 0 A_count = 0 for i in range(N): if S[i] == 'A': A_count += 1 elif S[i] == 'C': ans += A_count print(ans) exit() def calc_point(q): # 三分探索が最低値を探すようにできているのでcalcはマイナスになるようにした calc = 0 A_count = 0 used = 0 for i in range(N): if S[i] == 'A': A_count += 1 elif S[i] == 'C': calc += A_count elif S[i] == '?': if used < q: # treat as A used += 1 A_count += 1 else: # treat as C calc += A_count return -calc # 谷、つまり1極値を求める三分探索での解き方 # https://roiti46.hatenablog.com/entry/2015/04/29/yukicoder_No.198_%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%87%E3%82%A3%E3%83%BC%E3%83%BB%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%EF%BC%92 # https://qiita.com/ganyariya/items/1553ff2bf8d6d7789127 # 範囲に注意、ギリギリありえない値とする left, right = -1, q_count+1 while right-left > 2: left_mid, right_mid = (2*left+right)//3, (left+2*right)//3 if calc_point(left_mid) <= calc_point(right_mid): # 右midの方が大きいから右を右midに変える right = right_mid else: left = left_mid #print(left_mid, right_mid) ans = min(calc_point(left_mid), calc_point(right_mid)) # leftとrightの間も入れる必要あるのか? print(-ans) # マイナスにして最低値を探したが、答えはプラスの最大値だから