← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

var (
	n      int
	counts [23][26]int32
	g      []uint32
)

func dfs(u int, mask int, minCounts [26]int32, sign int) {
	if u == n {
		if mask == 0 {
			g[0] = 0
			return
		}
		prod := int64(1)
		for i := 0; i < 26; i++ {
			prod = (prod * int64(minCounts[i]+1)) % 998244353
		}
		if sign == -1 {
			prod = 998244353 - prod
			if prod == 998244353 {
				prod = 0
			}
		}
		g[mask] = uint32(prod)
		return
	}
	dfs(u+1, mask, minCounts, sign)

	for i := 0; i < 26; i++ {
		if counts[u][i] < minCounts[i] {
			minCounts[i] = counts[u][i]
		}
	}
	dfs(u+1, mask|(1<<u), minCounts, -sign)
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	buf := make([]byte, 2000000)
	scanner.Buffer(buf, 2000000)

	if !scanner.Scan() {
		return
	}
	nStr := scanner.Text()
	n = 0
	for i := 0; i < len(nStr); i++ {
		n = n*10 + int(nStr[i]-'0')
	}

	for i := 0; i < n; i++ {
		scanner.Scan()
		s := scanner.Text()
		for j := 0; j < len(s); j++ {
			counts[i][s[j]-'a']++
		}
	}

	g = make([]uint32, 1<<n)
	var initCounts [26]int32
	for i := 0; i < 26; i++ {
		initCounts[i] = 1e9
	}
	dfs(0, 0, initCounts, -1)

	for i := 0; i < n; i++ {
		bit := 1 << i
		for mask := 0; mask < (1 << n); mask += (bit << 1) {
			for j := 0; j < bit; j++ {
				g[mask|bit|j] += g[mask|j]
				if g[mask|bit|j] >= 998244353 {
					g[mask|bit|j] -= 998244353
				}
			}
		}
	}

	k := make([]uint8, 1<<n)
	sum := make([]uint16, 1<<n)
	for i := 0; i < n; i++ {
		bit := 1 << i
		for mask := 0; mask < bit; mask++ {
			k[mask|bit] = k[mask] + 1
			sum[mask|bit] = sum[mask] + uint16(i+1)
		}
	}

	var ans uint64 = 0
	for mask := 1; mask < (1<<n); mask++ {
		val := uint64(g[mask]) * uint64(k[mask]) * uint64(sum[mask])
		ans ^= val
	}

	fmt.Println(ans)
}
```