package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
var n int
fmt.Fscan(reader, &n)
var v [23][26]int16
for i := 0; i < n; i++ {
var s string
fmt.Fscan(reader, &s)
for j := 0; j < len(s); j++ {
v[i][s[j]-'a']++
}
}
f := make([]uint32, 1<<n)
var dfs func(idx int, mask int, parity int, current_min *[26]int16)
dfs = func(idx int, mask int, parity int, current_min *[26]int16) {
if idx == n {
if mask != 0 {
prod := uint32(1)
for c := 0; c < 26; c++ {
prod = uint32((uint64(prod) * uint64(current_min[c]+1)) % 998244353)
}
if parity == 0 {
prod = 998244353 - prod
if prod == 998244353 {
prod = 0
}
}
f[mask] = prod
}
return
}
dfs(idx+1, mask, parity, current_min)
var next_min [26]int16
for c := 0; c < 26; c++ {
if current_min[c] < v[idx][c] {
next_min[c] = current_min[c]
} else {
next_min[c] = v[idx][c]
}
}
dfs(idx+1, mask|(1<<idx), 1-parity, &next_min)
}
var init_min [26]int16
for c := 0; c < 26; c++ {
init_min[c] = 20005
}
dfs(0, 0, 0, &init_min)
for i := 0; i < n; i++ {
bit := 1 << i
for mask := 0; mask < (1<<n); mask += (bit << 1) {
for j := 0; j < bit; j++ {
f[mask|bit|j] += f[mask|j]
if f[mask|bit|j] >= 998244353 {
f[mask|bit|j] -= 998244353
}
}
}
}
sum_i := make([]uint32, 1<<n)
k_count := make([]uint32, 1<<n)
for i := 0; i < n; i++ {
bit := 1 << i
for mask := 0; mask < bit; mask++ {
sum_i[mask|bit] = sum_i[mask] + uint32(i+1)
k_count[mask|bit] = k_count[mask] + 1
}
}
var ans uint64
for mask := 1; mask < (1 << n); mask++ {
val := uint64(f[mask])
res := val * uint64(k_count[mask]) * uint64(sum_i[mask])
ans ^= res
}
fmt.Println(ans)
}