Problem:
Score : 400 points

Problem Statement

Snuke has N strings. The i-th string is s_i.

Let us concatenate these strings into one string after arranging them in some order.
Find the maximum possible number of occurrences of AB in the resulting string.

Constraints

1 \leq N \leq 10^{4}

2 \leq |s_i| \leq 10

s_i consists of uppercase English letters.

Input

Input is given from Standard Input in the following format:

N
s_1
\vdots
s_N

Output

Print the answer.

Sample Input 1

3
ABCA
XBAZ
BAD

Sample Output 1

2

For example, if we concatenate ABCA, BAD and XBAZ in this order, the resulting string ABCABADXBAZ has two occurrences of AB.

Sample Input 2

9
BEWPVCRWH
ZZNQYIJX
BAVREA
PA
HJMYITEOX
BCJHMRMNK
BP
QVFABZ
PRGKSPUNA

Sample Output 2

4

Sample Input 3

7
RABYBBE
JOZ
BMHQUVA
BPA
ISU
MCMABAOBHZ
SZMEHMA

Sample Output 3

4

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;

class Program {
    static void Main(string[] args) {
        //入力
        int N = int.Parse(Console.ReadLine());

        string[] s = new string[N];
        string[] t = new string[N];
        for (int i = 0; i < N; i++) {
            s[i] = Console.ReadLine();
        }

        //解答となる数値
        int ans = 0;

        int endsA = 0;  //Aで終わる文字列の個数
        int startsB = 0;  //Bで始まる文字列の個数

        int containsAB = 0;  //ABが文字列中に含まれる箇所の数

        //検証
        for (int i = 0; i < N; i++) {
            //System.Text.StringBuilder sb = new System.Text.StringBuilder(s[i]);
            //while (sb.ToString().Contains("AB")){
            //    int indexOfAB = s[i].IndexOf("AB");
            //    sb.Replace("AB", "XX", 0, indexOfAB + 1);
            //    containsAB++;
            //}
            containsAB += CountOf(s[i], "AB");
            t[i] = s[i].Replace("AB", "XX");
        }

        //AB文字列中の個数も回答に加える
        ans += containsAB;

        for (int i = 0; i < N; i++) {
            if (t[i][0] == 'B') {
                startsB++;
            }
            if (t[i][t[i].Length - 1] == 'A') {
                endsA++;
            }
        }

        //いずれか小さいほうを解答に加える
        ans += Math.Min(endsA, startsB);

        //出力
        //for (int i = 0; i < N; i++) {
        //    Console.WriteLine(s[i]);
        //}

        Console.WriteLine(ans);
    }

    public static int CountOf(string target, params string[] strArray) {
        int count = 0;

        foreach (string str in strArray) {
            int index = target.IndexOf(str, 0);
            while (index != -1) {
                count++;
                index = target.IndexOf(str, index + str.Length);
            }
        }

        return count;
    }

    public static string ChangeCharAt(string str, int index, char newChar) {
        return str.Remove(index, 1).Insert(index, newChar.ToString());
    }
}