← Home
For problem statement at 0-999/500-599/590-599/599/problemE.txt this is a correct solution, but verifier at 0-999/500-599/590-599/599/verifierE.go ends with All tests passed can you fix the verifier? ```go
package main

import (
	"fmt"
	"math/bits"
)

type Edge struct{ u, v int }
type Query struct{ a, b, c int }

func main() {
	var n, m, q int
	if _, err := fmt.Scan(&n, &m, &q); err != nil {
		return
	}

	edges := make([]Edge, m)
	for i := 0; i < m; i++ {
		var u, v int
		fmt.Scan(&u, &v)
		edges[i] = Edge{u - 1, v - 1}
	}

	queries := make([]Query, q)
	for i := 0; i < q; i++ {
		var a, b, c int
		fmt.Scan(&a, &b, &c)
		queries[i] = Query{a - 1, b - 1, c - 1}
	}

	var memo [1 << 13][13]int64
	for i := 0; i < (1 << 13); i++ {
		for j := 0; j < 13; j++ {
			memo[i][j] = -1
		}
	}

	var solve func(mask, root int) int64
	solve = func(mask, root int) int64 {
		if mask == (1 << root) {
			return 1
		}
		if memo[mask][root] != -1 {
			return memo[mask][root]
		}

		for _, qry := range queries {
			a, b, c := qry.a, qry.b, qry.c
			if ((1<<a)&mask) != 0 && ((1<<b)&mask) != 0 {
				if ((1<<c)&mask) == 0 {
					memo[mask][root] = 0
					return 0
				}
				if c != root && (a == root || b == root) {
					memo[mask][root] = 0
					return 0
				}
			}
		}

		rem_mask := mask & ^(1 << root)

		var parent [13]int
		for i := 0; i < n; i++ {
			parent[i] = i
		}
		var find func(i int) int
		find = func(i int) int {
			if parent[i] == i {
				return i
			}
			parent[i] = find(parent[i])
			return parent[i]
		}
		union := func(i, j int) {
			rootI := find(i)
			rootJ := find(j)
			if rootI != rootJ {
				parent[rootI] = rootJ
			}
		}

		for _, e := range edges {
			u, v := e.u, e.v
			if ((1<<u)&rem_mask) != 0 && ((1<<v)&rem_mask) != 0 {
				union(u, v)
			}
		}

		var must_not [13]int

		for _, qry := range queries {
			a, b, c := qry.a, qry.b, qry.c
			if ((1<<a)&mask) != 0 && ((1<<b)&mask) != 0 {
				if c != root {
					union(a, c)
					union(b, c)
				} else {
					if a != root && b != root {
						must_not[a] |= (1 << b)
						must_not[b] |= (1 << a)
					}
				}
			}
		}

		var b_arr [13]int
		for i := 0; i < n; i++ {
			if ((1<<i)&rem_mask) != 0 {
				b_arr[find(i)] |= (1 << i)
			}
		}

		blocks := make([]int, 0, n)
		for i := 0; i < n; i++ {
			if b_arr[i] != 0 {
				blocks = append(blocks, b_arr[i])
			}
		}
		p := len(blocks)

		for _, b := range blocks {
			for i := 0; i < n; i++ {
				if ((1<<i)&b) != 0 {
					if (must_not[i] & b) != 0 {
						memo[mask][root] = 0
						return 0
					}
				}
			}
		}

		var bad_pairs [13]int
		for i := 0; i < p; i++ {
			for j := i + 1; j < p; j++ {
				hasBad := false
				for u := 0; u < n; u++ {
					if ((1<<u)&blocks[i]) != 0 {
						if (must_not[u] & blocks[j]) != 0 {
							hasBad = true
							break
						}
					}
				}
				if hasBad {
					bad_pairs[i] |= (1 << j)
					bad_pairs[j] |= (1 << i)
				}
			}
		}

		part_dp := make([]int64, 1<<p)
		part_dp[0] = 1
		for b_mask := 1; b_mask < (1 << p); b_mask++ {
			v_bit := bits.TrailingZeros(uint(b_mask))
			rem_b := b_mask ^ (1 << v_bit)
			sub_rem := rem_b
			for {
				sub := sub_rem | (1 << v_bit)

				indep := true
				sub_copy := sub
				for sub_copy > 0 {
					i := bits.TrailingZeros(uint(sub_copy))
					if (bad_pairs[i] & sub) != 0 {
						indep = false
						break
					}
					sub_copy &= sub_copy - 1
				}

				if indep {
					S_mask := 0
					sub_copy2 := sub
					for sub_copy2 > 0 {
						i := bits.TrailingZeros(uint(sub_copy2))
						S_mask |= blocks[i]
						sub_copy2 &= sub_copy2 - 1
					}

					var w int64 = 0
					for r := 0; r < n; r++ {
						if ((1<<r)&S_mask) != 0 {
							valid_r := true
							for _, e := range edges {
								u, v := e.u, e.v
								if u == root && ((1<<v)&S_mask) != 0 && v != r {
									valid_r = false
									break
								}
								if v == root && ((1<<u)&S_mask) != 0 && u != r {
									valid_r = false
									break
								}
							}
							if valid_r {
								w += solve(S_mask, r)
							}
						}
					}
					part_dp[b_mask] += w * part_dp[b_mask^sub]
				}

				if sub_rem == 0 {
					break
				}
				sub_rem = (sub_rem - 1) & rem_b
			}
		}

		memo[mask][root] = part_dp[(1<<p)-1]
		return part_dp[(1<<p)-1]
	}

	ans := solve((1<<n)-1, 0)
	fmt.Println(ans)
}
```