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;

public static partial class Program
{
    public static int r;
    public static int g;
    public static int b;
    public static int n;

    public static void Main()
    {
        var n = CRL().ToInt();
        var abcnt = new int[n];

        var fb = new List<int>();
        var ea = new List<int>();
        var both = new List<int>();
        for (int i = 0; i < n; i++)
        {
            var str = CRL();
            for (int j = 0; j < str.Length - 1; j++)
            {
                if (str[j] == 'A' && str[j + 1] == 'B')
                {
                    abcnt[i]++;
                }
            }

            if (str[0] == 'B' && str[str.Length - 1] == 'A')
            {
                both.Add(i);
                continue;
            }

            if (str[0] == 'B')
            {
                fb.Add(i);
            }

            if (str[str.Length - 1] == 'A')
            {
                ea.Add(i);
            }
        }

        var cnt = abcnt.Sum();

        if (fb.Count > ea.Count)
        {
            cnt += ea.Count;
        }
        else
        {
            cnt += fb.Count;
        }

        var rmc = Math.Min(ea.Count, fb.Count);
        fb.RemoveRange(0, rmc);
        ea.RemoveRange(0, rmc);
        List<int> list;
        if (fb.Count == 0)
        {
            list = ea;
        }
        else
        {
            list = fb;
        }

        if (list.Count == 0 && both.Count == 0)
        {
            CWL(cnt);
            return;
        }

        if (list.Count == 0)
        {
            cnt += both.Count - 1;
        }
        else
        {
            if (list.Count <= both.Count)
            {
                cnt += list.Count;
                both.RemoveRange(0, list.Count);
                if (both.Count != 0)
                {
                    cnt += both.Count;
                }
            }
            else
            {
                cnt += both.Count;
            }
        }

        CWL(cnt);
    }
}

public static partial class Program
{
    //テンプレここから
    public static long GCD(long a, long b) => b == 0 ? a : GCD(b, a % b);
    public static int GCD(int a, int b) => b == 0 ? a : GCD(b, a % b);
    public static long LCM(long a, long b) => a * b / GCD(a, b);
    public static int LCM(int a, int b) => a * b / GCD(a, b);
    public static int ToInt(this double d) => (int) d;
    public static long ToLong(this double d) => (long) d;
    public static int ToInt(this string str) => int.Parse(str);
    public static long ToLong(this string str) => long.Parse(str);
    public static long[] ToLong(this IEnumerable<string> strs) => strs.Select(x => x.ToLong()).ToArray();
    public static int[] ToInt(this IEnumerable<string> strs) => strs.Select(x => x.ToInt()).ToArray();
    public static long[] ArrayLongs(this string str, char opr = ' ') => str.Split(opr).ToLong();
    public static int[] ArrayInts(this string str, char opr = ' ') => str.Split(opr).ToInt();
    public static string CRL() => Console.ReadLine();
    public static string RL() => Console.ReadLine();
    public static void CWL(object obj) => Console.WriteLine(obj);
    public static void WL(object obj) => Console.WriteLine(obj);
    public static long Diff(long a, long b) => Math.Abs(Math.Max(a, b) - Math.Min(a, b));
    public static int Diff(int a, int b) => Math.Abs(Math.Max(a, b) - Math.Min(a, b));
    public static long Sign(this long i) => Math.Sign(i);
    public static bool IsEven(this long i) => i % 2 == 0;
    public static bool IsEven(this int i) => i % 2 == 0;
    public static int[] dx = new[] {0, -1, 0, 1};
    public static int[] dy = new[] {-1, 0, 1, 0};
    public static long mod = 1000000007;
    public static string alphabet = "abcdefghijklmnopqrstuvwxyz";
    public static long ToLong(this char c) => c.ToString().ToInt();
    public static long[] Sort(this long[] array) => array.OrderBy(x => x).ToArray();
    public static int[] Sort(this int[] array) => array.OrderBy(x => x).ToArray();
    public static long[] DSort(this long[] array) => array.OrderByDescending(x => x).ToArray();
    public static int[] DSort(this int[] array) => array.OrderByDescending(x => x).ToArray();
    public static string Join(this IEnumerable<string> array, string sep = "") => string.Join(sep, array);

    public static string Join(this IEnumerable<char> array, string sep = "") => string.Join(sep, array);

    //テンプレここまで
}