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 C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;

class AGC_034_B
{
    static void Main(string[] args)
    {
        char[] S = Console.ReadLine().ToCharArray();

        if(S.Length<3)
        {
            Console.WriteLine(0);
            return;
        }

        List<char> ns = new List<char>();
        for (int i = 0; i < S.Length; i++)
        {
            char c1 = S[i];

            if(c1=='B')
            {
                if (i+1 < S.Length)
                {
                    char c2 = S[i+1];
                    if (c2 == 'C')
                    {
                        ns.Add('D');
                        i++;
                    }
                    else
                    {
                        ns.Add(c1);
                    }
                }
                else
                {
                    ns.Add(c1);
                }
            }
            else
            {
                ns.Add(c1);
            }
        }

        char[] newS = ns.ToArray();
        long ans = 0;
        long counter = 0;
        for (int i = newS.Length-1; i>=0 ; i--)
        {
            if (newS[i] == 'D')
            {
                counter++;
            }
            else if (newS[i] == 'A')
            {
                ans += counter;
            }
            else
            {
                counter = 0;
            }
        }

        Console.WriteLine(ans);
    }
}