← Home
For problem statement at 0-999/900-999/990-999/993/problemF.txt this is a correct solution, but verifier at 0-999/900-999/990-999/993/verifierF.go ends with All tests passed! can you fix the verifier? package main

import (
	"fmt"
)

type Gate struct {
	op   string
	c, d int
}

func eval(op string, a, b int) int {
	switch op {
	case "and":
		return a & b
	case "or":
		return a | b
	case "nand":
		return 1 - (a & b)
	case "nor":
		return 1 - (a | b)
	}
	return 0
}

func getInputs(s string) (int, int) {
	var c, d int
	first := true
	for i, ch := range s {
		if ch == 'x' {
			if first {
				c = i
				first = false
			} else {
				d = i
			}
		}
	}
	return c, d
}

var n, m, k int
var l1 []Gate
var l2 []Gate
var maxValid int = -1

func checkCond2(R []int) bool {
	req := make([]int, m)
	for i := range req {
		req[i] = -1
	}
	for _, idx := range R {
		g := l2[idx]
		v := 0
		if g.op == "nand" || g.op == "nor" {
			v = 1
		}
		for _, c := range []int{g.c, g.d} {
			if req[c] != -1 && req[c] != v {
				return true
			}
			req[c] = v
		}
	}

	involved := make([]bool, n)
	for i, r := range req {
		if r != -1 {
			involved[l1[i].c] = true
			involved[l1[i].d] = true
		}
	}
	var vars []int
	for i := 0; i < n; i++ {
		if involved[i] {
			vars = append(vars, i)
		}
	}

	x := make([]int, n)
	for i := range x {
		x[i] = -1
	}

	var solve func(idx int) bool
	solve = func(idx int) bool {
		for i, r := range req {
			if r != -1 {
				g1 := l1[i]
				va, vb := x[g1.c], x[g1.d]
				if va != -1 && vb != -1 {
					if eval(g1.op, va, vb) != r {
						return false
					}
				}
			}
		}
		if idx == len(vars) {
			return true
		}
		v := vars[idx]
		x[v] = 0
		if solve(idx + 1) {
			return true
		}
		x[v] = 1
		if solve(idx + 1) {
			return true
		}
		x[v] = -1
		return false
	}

	return !solve(0)
}

func intersect(a, b []int) []int {
	m := make(map[int]bool)
	for _, v := range a {
		m[v] = true
	}
	var res []int
	for _, v := range b {
		if m[v] {
			res = append(res, v)
		}
	}
	return res
}

func remove(s []int, v int) []int {
	var res []int
	for _, x := range s {
		if x != v {
			res = append(res, x)
		}
	}
	return res
}

var adj [][]int

func bk(R, P, X []int) {
	if len(P) == 0 && len(X) == 0 {
		if len(R) > 0 && checkCond2(R) {
			if len(R) > maxValid {
				maxValid = len(R)
			}
		}
		return
	}
	P_copy := append([]int(nil), P...)
	for _, v := range P_copy {
		nR := append(append([]int(nil), R...), v)
		nP := intersect(P, adj[v])
		nX := intersect(X, adj[v])
		bk(nR, nP, nX)
		P = remove(P, v)
		X = append(X, v)
	}
}

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

	l1 = make([]Gate, m)
	for i := 0; i < m; i++ {
		var op, s string
		fmt.Scan(&op, &s)
		c, d := getInputs(s)
		l1[i] = Gate{op, c, d}
	}

	l2 = make([]Gate, k)
	for i := 0; i < k; i++ {
		var op, s string
		fmt.Scan(&op, &s)
		c, d := getInputs(s)
		l2[i] = Gate{op, c, d}
	}

	validEdge := func(i, j int) bool {
		gI := l2[i]
		gJ := l2[j]
		varsMap := make(map[int]bool)
		for _, idx := range []int{gI.c, gI.d, gJ.c, gJ.d} {
			varsMap[l1[idx].c] = true
			varsMap[l1[idx].d] = true
		}
		var vars []int
		for v := range varsMap {
			vars = append(vars, v)
		}

		numVars := len(vars)
		for mask := 0; mask < (1 << numVars); mask++ {
			x := make([]int, n)
			for bit := 0; bit < numVars; bit++ {
				if (mask & (1 << bit)) != 0 {
					x[vars[bit]] = 1
				} else {
					x[vars[bit]] = 0
				}
			}

			evalG := func(idx int, normal bool) int {
				g := l1[idx]
				res := eval(g.op, x[g.c], x[g.d])
				if normal {
					return res
				}
				return 1 - res
			}

			pi := eval(gI.op, evalG(gI.c, true), evalG(gI.d, true))
			qj := eval(gJ.op, evalG(gJ.c, false), evalG(gJ.d, false))
			if pi == 1 && qj == 0 {
				return false
			}
		}
		return true
	}

	adj = make([][]int, k)
	for i := 0; i < k; i++ {
		if !validEdge(i, i) {
			continue
		}
		for j := i + 1; j < k; j++ {
			if !validEdge(j, j) {
				continue
			}
			if validEdge(i, j) && validEdge(j, i) {
				adj[i] = append(adj[i], j)
				adj[j] = append(adj[j], i)
			}
		}
	}

	var P []int
	for i := 0; i < k; i++ {
		if validEdge(i, i) {
			P = append(P, i)
		}
	}

	bk([]int{}, P, []int{})

	if maxValid == -1 {
		fmt.Println("-1")
	} else {
		fmt.Println(k - maxValid)
	}
}