Problem:
Score : 600 points

Problem Statement

You are given a string s consisting of A, B and C.

Snuke wants to perform the following operation on s as many times as possible:

Choose a contiguous substring of s that reads ABC and replace it with BCA.

Find the maximum possible number of operations.

Constraints

1 \leq |s| \leq 200000

Each character of s is A, B and C.

Input

Input is given from Standard Input in the following format:

s

Output

Find the maximum possible number of operations.

Sample Input 1

ABCABC

Sample Output 1

3

You can perform the operations three times as follows: ABCABC → BCAABC → BCABCA → BCBCAA. This is the maximum result.

Sample Input 2

C

Sample Output 2

0

Sample Input 3

ABCACCBABCBCAABCB

Sample Output 3

6

Solution in OCaml (4.10.0) (judge verdict: Accepted)

let split_string ?(pattern="") = Str.split @@ Str.regexp pattern
let ($) f g = fun x -> g (f x)

let s = read_line ()
  |> Str.global_replace (Str.regexp "A") "x"
  |> Str.global_replace (Str.regexp "BC") "y"
  |> Str.split (Str.regexp "[^xy]+")
  |> List.map (split_string $ List.rev)

let rec f pos x_cnt sum = function
  | "x" :: xs -> f (pos + 1) (x_cnt + 1) (sum + pos - x_cnt) xs
  | "y" :: ys -> f (pos + 1) x_cnt sum ys
  | _ -> sum

let () = List.map (f 0 0 0) s |> List.fold_left (+) 0 |> Printf.printf "%d\n"