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: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ProblemB
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.SetIn(new System.IO.StreamReader(Console.OpenStandardInput(8192)));
            var S = Console.ReadLine();
            var N = S.Length;
            var ret = 0;
            var ACnt = 0;
            for (int i = 0; i < N - 2;i++)
            {
                if (i < N - 2 && S[i] == 'A')
                {
                    ACnt++;
                }
                else if (i < N - 1 && S[i] == 'B' && S[i + 1] == 'C')
                {
                    ret += ACnt;
                    i++;
                }
                else
                    ACnt = 0;
                //if (i < N - 2 && S[i] == 'A')
                //{
                //    int ACount = 1;
                //    for (int j = i + 1; j < N + 1;)
                //    {
                //        if (j < N - 2 && S[j] == 'A')
                //        {
                //            ACount++;
                //            j++;
                //        }
                //        else if (j < N - 1 && S[j] == 'B' && S[j + 1] == 'C')
                //        {
                //            ret += ACount;
                //            j += 2;
                //        }
                //        else
                //        {
                //            i = j;
                //            break;
                //        }
                //    }
                //}
                //else
                //    i++;
            }
            Console.WriteLine(ret);
        }
    }
}