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 Go (1.6) (judge verdict: Wrong Answer)

package main

import (
	"fmt"
	"math"
	"strings"
)

func min(nums ...int) int {
	if len(nums) == 0 {
		panic("funciton min() requires at least one argument.")
	}
	res := nums[0]
	for i := 0; i < len(nums); i++ {
		res = int(math.Min(float64(res), float64(nums[i])))
	}
	return res
}

func max(nums ...int) int {
	if len(nums) == 0 {
		panic("funciton max() requires at least one argument.")
	}
	res := nums[0]
	for i := 0; i < len(nums); i++ {
		res = int(math.Max(float64(res), float64(nums[i])))
	}
	return res
}

func main() {
	var n int
	fmt.Scan(&n)

	t := make([]string, n)
	for i := 0; i < n; i++ {
		fmt.Scan(&t[i])
	}

	ABdata := make([]int, 4)
	for i := 0; i < n; i++ {
		ABdata[0] += strings.Count(t[i], "AB")
		runeT := []rune(t[i])
		if runeT[len(runeT)-1] == 'A' && runeT[0] == 'B' {
			ABdata[1]++
		} else if runeT[len(runeT)-1] == 'A' {
			ABdata[2]++
		} else if runeT[0] == 'B' {
			ABdata[3]++
		}
	}
	var ans int
	if ABdata[1] == n {
		ans = ABdata[0] + ABdata[1] - 2
	} else if ABdata[2] > 0 && ABdata[3] > 0 {
		ans = ABdata[0] + min(ABdata[2], ABdata[3]) + ABdata[1]
	} else if ABdata[2] == 0 && ABdata[3] == 0 {
		ans = ABdata[0] + max(ABdata[1]-2, 0)
	} else {
		ans = ABdata[0] + max(ABdata[1], 0)
	}
	fmt.Println(ans)
}