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.02.3) (judge verdict: Accepted)

let () =
  let s = read_line () in
  Printf.printf "%d\n" @@
  fst @@
  Array.fold_left (fun (acc, s) c ->
    match s, c with
    | `A n, 'A' -> (acc, `A (n + 1))
    | `AB _, 'A' -> (acc, `A 1)
    | `A n, 'B' -> (acc, `AB n)
    | `AB n, 'C' -> (acc + n, `A n)
    | _ -> (acc, `A 0)) (0, `A 0) @@
  Array.init (String.length s) (String.get s)