package main
import (
"fmt"
"io"
"os"
)
const (
M1 uint64 = 1000000007
M2 uint64 = 1000000009
B1 uint64 = 911382323
B2 uint64 = 972663749
)
type Scanner struct {
data []byte
idx int
}
func (s *Scanner) skip() {
for s.idx < len(s.data) && s.data[s.idx] <= ' ' {
s.idx++
}
}
func (s *Scanner) NextInt() int {
s.skip()
n := 0
for s.idx < len(s.data) && s.data[s.idx] > ' ' {
n = n*10 + int(s.data[s.idx]-'0')
s.idx++
}
return n
}
func (s *Scanner) NextBytes() []byte {
s.skip()
start := s.idx
for s.idx < len(s.data) && s.data[s.idx] > ' ' {
s.idx++
}
return s.data[start:s.idx]
}
func makeKey(str []byte, m int) string {
var cnt [26]int
for _, ch := range str {
cnt[ch-'a']++
}
b := make([]byte, m)
p := 0
for c := 0; c < 26; c++ {
ch := byte('a' + c)
for t := 0; t < cnt[c]; t++ {
b[p] = ch
p++
}
}
return string(b)
}
func oneOp(a, b []byte) bool {
m := len(a)
l := 0
for l < m && a[l] == b[l] {
l++
}
if l == m {
return false
}
src, tgt := a, b
if a[l] < b[l] {
src, tgt = b, a
}
r := m - 1
for src[r] == tgt[r] {
r--
}
for i := l + 1; i <= r; i++ {
if tgt[i-1] > tgt[i] {
return false
}
}
var diff [26]int
for i := l; i <= r; i++ {
diff[src[i]-'a']++
diff[tgt[i]-'a']--
}
for i := 0; i < 26; i++ {
if diff[i] != 0 {
return false
}
}
return true
}
func pack(h1, h2 uint64) uint64 {
return (h1 << 32) | h2
}
func countGen(strs [][]byte, keys []string, freq map[string]int, m int) int64 {
pow1 := make([]uint64, m+1)
pow2 := make([]uint64, m+1)
geom1 := make([]uint64, m+1)
geom2 := make([]uint64, m+1)
pow1[0], pow2[0] = 1, 1
for i := 1; i <= m; i++ {
pow1[i] = pow1[i-1] * B1 % M1
pow2[i] = pow2[i-1] * B2 % M2
geom1[i] = (geom1[i-1]*B1 + 1) % M1
geom2[i] = (geom2[i-1]*B2 + 1) % M2
}
set := make(map[uint64]struct{}, len(strs)*2)
for _, s := range strs {
var h1, h2 uint64
for _, ch := range s {
v := uint64(ch-'a') + 1
h1 = (h1*B1 + v) % M1
h2 = (h2*B2 + v) % M2
}
set[pack(h1, h2)] = struct{}{}
}
pref1 := make([]uint64, m+1)
pref2 := make([]uint64, m+1)
var treeH1 [64]uint64
var treeH2 [64]uint64
var treeLen [64]int
var cnt [26]int
var ans int64
for idx, s := range strs {
if freq[keys[idx]] < 2 {
continue
}
pref1[0], pref2[0] = 0, 0
for i := 0; i < m; i++ {
v := uint64(s[i]-'a') + 1
pref1[i+1] = (pref1[i]*B1 + v) % M1
pref2[i+1] = (pref2[i]*B2 + v) % M2
}
full1 := pref1[m]
full2 := pref2[m]
for l := 0; l < m; l++ {
for i := 0; i < 64; i++ {
treeH1[i] = 0
treeH2[i] = 0
treeLen[i] = 0
}
for i := 0; i < 26; i++ {
cnt[i] = 0
}
minC, maxC := 26, -1
leftChar := int(s[l] - 'a')
prefixShifted1 := pref1[l] * pow1[m-l] % M1
prefixShifted2 := pref2[l] * pow2[m-l] % M2
for r := l; r < m; r++ {
c := int(s[r] - 'a')
if c < minC {
minC = c
}
if c > maxC {
maxC = c
}
cnt[c]++
p := 32 + c
treeLen[p] = cnt[c]
treeH1[p] = uint64(c+1) * geom1[cnt[c]] % M1
treeH2[p] = uint64(c+1) * geom2[cnt[c]] % M2
for p >>= 1; p > 0; p >>= 1 {
lc := p << 1
rc := lc | 1
treeLen[p] = treeLen[lc] + treeLen[rc]
treeH1[p] = (treeH1[lc]*pow1[treeLen[rc]] + treeH1[rc]) % M1
treeH2[p] = (treeH2[lc]*pow2[treeLen[rc]] + treeH2[rc]) % M2
}
if leftChar == minC || int(s[r]-'a') == maxC {
continue
}
sufLen := m - r - 1
suf1 := full1 + M1 - pref1[r+1]*pow1[sufLen]%M1
if suf1 >= M1 {
suf1 -= M1
}
suf2 := full2 + M2 - pref2[r+1]*pow2[sufLen]%M2
if suf2 >= M2 {
suf2 -= M2
}
cand1 := prefixShifted1 + treeH1[1]*pow1[sufLen]%M1
if cand1 >= M1 {
cand1 -= M1
}
cand1 += suf1
if cand1 >= M1 {
cand1 -= M1
}
cand2 := prefixShifted2 + treeH2[1]*pow2[sufLen]%M2
if cand2 >= M2 {
cand2 -= M2
}
cand2 += suf2
if cand2 >= M2 {
cand2 -= M2
}
if _, ok := set[pack(cand1, cand2)]; ok {
ans++
}
}
}
}
return ans
}
func main() {
data, _ := io.ReadAll(os.Stdin)
sc := Scanner{data: data}
n := sc.NextInt()
strs := make([][]byte, n)
for i := 0; i < n; i++ {
strs[i] = sc.NextBytes()
}
m := len(strs[0])
keys := make([]string, n)
freq := make(map[string]int, n)
var anagramPairs int64
for i := 0; i < n; i++ {
key := makeKey(strs[i], m)
keys[i] = key
anagramPairs += int64(freq[key])
freq[key]++
}
multi := 0
for _, c := range freq {
if c > 1 {
multi += c
}
}
genCost := int64(multi) * int64(m) * int64(m+1) / 2 * 6
pairCost := anagramPairs * int64(m)
var oneOpPairs int64
if pairCost <= genCost {
groups := make(map[string][]int, len(freq))
for i := 0; i < n; i++ {
if freq[keys[i]] > 1 {
groups[keys[i]] = append(groups[keys[i]], i)
}
}
for _, idxs := range groups {
for i := 0; i < len(idxs); i++ {
s1 := strs[idxs[i]]
for j := i + 1; j < len(idxs); j++ {
if oneOp(s1, strs[idxs[j]]) {
oneOpPairs++
}
}
}
}
} else {
oneOpPairs = countGen(strs, keys, freq, m)
}
totalPairs := int64(n) * int64(n-1) / 2
ans := 1337*totalPairs - 1335*anagramPairs - oneOpPairs
fmt.Println(ans)
}