← Home
```go
package main

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

type TrieNode struct {
	child [2]int32
	cnt   int32
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var N, M int
	fmt.Fscan(reader, &N, &M)

	A := make([]int, N)
	for i := 0; i < N; i++ {
		fmt.Fscan(reader, &A[i])
	}

	X := make([]int, M)
	for i := 0; i < M; i++ {
		fmt.Fscan(reader, &X[i])
	}

	// min xor distance in A
	sort.Ints(A)
	D := -1
	for i := 0; i < N-1; i++ {
		xor := A[i] ^ A[i+1]
		if D == -1 || xor < D {
			D = xor
		}
	}

	// count pairs in X with xor <= D
	trie := make([]TrieNode, 1, M*30+1)
	trie[0] = TrieNode{child: [2]int32{-1, -1}}

	var ans int64 = 0

	for _, x := range X {
		// query
		node := int32(0)
		for b := 29; b >= 0; b-- {
			if node == -1 {
				break
			}
			xb := int32((x >> b) & 1)
			db := int32((D >> b) & 1)
			if db == 1 {
				if c := trie[node].child[xb]; c != -1 {
					ans += int64(trie[c].cnt)
				}
				node = trie[node].child[1-xb]
			} else {
				node = trie[node].child[xb]
			}
		}
		if node != -1 {
			ans += int64(trie[node].cnt)
		}

		// insert
		node = 0
		trie[node].cnt++
		for b := 29; b >= 0; b-- {
			xb := int32((x >> b) & 1)
			if trie[node].child[xb] == -1 {
				trie = append(trie, TrieNode{child: [2]int32{-1, -1}})
				trie[node].child[xb] = int32(len(trie) - 1)
			}
			node = trie[node].child[xb]
			trie[node].cnt++
		}
	}

	fmt.Fprintln(writer, ans)
}
```