← Home
```go
package main

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

type Aff struct {
	is bool
	d  byte
	p  byte
}

func evaluate(f string, val byte) byte {
	var vals []byte
	var ops []rune
	for i := 0; i < len(f); i++ {
		c := f[i]
		if c == '0' || c == '1' {
			vals = append(vals, c-'0')
		} else if c == '?' {
			vals = append(vals, val)
		} else if c == '(' {
		} else if c == '|' || c == '&' || c == '^' {
			ops = append(ops, rune(c))
		} else if c == ')' {
			op := ops[len(ops)-1]
			ops = ops[:len(ops)-1]
			right := vals[len(vals)-1]
			vals = vals[:len(vals)-1]
			left := vals[len(vals)-1]
			vals = vals[:len(vals)-1]
			var res byte
			switch op {
			case '^':
				res = left ^ right
			case '&':
				if left == 1 && right == 1 {
					res = 1
				} else {
					res = 0
				}
			case '|':
				if left == 1 || right == 1 {
					res = 1
				} else {
					res = 0
				}
			}
			vals = append(vals, res)
		}
	}
	return vals[0]
}

func getAff(f string) Aff {
	var vals []Aff
	var ops []rune
	for i := 0; i < len(f); i++ {
		c := f[i]
		if c == '0' {
			vals = append(vals, Aff{true, 0, 0})
		} else if c == '1' {
			vals = append(vals, Aff{true, 1, 0})
		} else if c == '?' {
			vals = append(vals, Aff{true, 0, 1})
		} else if c == '(' {
		} else if c == '|' || c == '&' || c == '^' {
			ops = append(ops, rune(c))
		} else if c == ')' {
			op := ops[len(ops)-1]
			ops = ops[:len(ops)-1]
			right := vals[len(vals)-1]
			vals = vals[:len(vals)-1]
			left := vals[len(vals)-1]
			vals = vals[:len(vals)-1]
			var res Aff
			if !left.is || !right.is {
				res = Aff{false, 0, 0}
			} else {
				switch op {
				case '^':
					d := left.d ^ right.d
					p := left.p ^ right.p
					res = Aff{true, d, p}
				case '&':
					if left.p != 0 && right.p != 0 {
						res = Aff{false, 0, 0}
					} else {
						var d, p byte
						if left.p == 0 {
							if left.d == 0 {
								d = 0
								p = 0
							} else {
								d = right.d
								p = right.p
							}
						} else {
							if right.d == 0 {
								d = 0
								p = 0
							} else {
								d = left.d
								p = left.p
							}
						}
						res = Aff{true, d, p}
					}
				case '|':
					if left.p != 0 && right.p != 0 {
						res = Aff{false, 0, 0}
					} else {
						var d, p byte
						if left.p == 0 {
							dl := left.d
							dr := right.d
							d = dl ^ dr ^ (dl & dr)
							coeff := byte(1) ^ dl
							if coeff == 1 {
								p = right.p
							} else {
								p = 0
							}
						} else {
							dr := right.d
							dl := left.d
							d = dl ^ dr ^ (dl & dr)
							coeff := byte(1) ^ dr
							if coeff == 1 {
								p = left.p
							} else {
								p = 0
							}
						}
						res = Aff{true, d, p}
					}
				}
			}
			vals = append(vals, res)
		}
	}
	return vals[0]
}

func main() {
	sc := bufio.NewScanner(os.Stdin)
	sc.Scan()
	sc.Scan()
	formula := sc.Text()
	v0 := evaluate(formula, 0)
	v1 := evaluate(formula, 1)
	if v0 != v1 {
		fmt.Println("YES")
	} else {
		aff := getAff(formula)
		if aff.is {
			fmt.Println("NO")
		} else {
			fmt.Println("YES")
		}
	}
}
```