← Home
package main

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

type Var struct {
	isConst bool
	val     string
	op1     int
	op2     int
	op      int
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())
	scanner.Scan()
	m, _ := strconv.Atoi(scanner.Text())

	vars := make([]Var, n)
	nameToId := make(map[string]int)

	for i := 0; i < n; i++ {
		scanner.Scan()
		name := scanner.Text()

		scanner.Scan() // skip :=

		scanner.Scan()
		tok := scanner.Text()

		var v Var
		if tok[0] == '0' || tok[0] == '1' {
			v.isConst = true
			v.val = tok
		} else {
			v.isConst = false
			if tok == "?" {
				v.op1 = -1
			} else {
				v.op1 = nameToId[tok]
			}

			scanner.Scan()
			opStr := scanner.Text()
			if opStr == "AND" {
				v.op = 0
			} else if opStr == "OR" {
				v.op = 1
			} else {
				v.op = 2
			}

			scanner.Scan()
			tok2 := scanner.Text()
			if tok2 == "?" {
				v.op2 = -1
			} else {
				v.op2 = nameToId[tok2]
			}
		}

		nameToId[name] = i
		vars[i] = v
	}

	minAns := make([]byte, m)
	maxAns := make([]byte, m)

	val := make([]int, n)

	for j := 0; j < m; j++ {
		sum0 := 0
		sum1 := 0

		for bitVal := 0; bitVal <= 1; bitVal++ {
			sum := 0
			for i := 0; i < n; i++ {
				v := vars[i]
				if v.isConst {
					val[i] = int(v.val[j] - '0')
				} else {
					v1 := bitVal
					if v.op1 != -1 {
						v1 = val[v.op1]
					}
					v2 := bitVal
					if v.op2 != -1 {
						v2 = val[v.op2]
					}
					res := 0
					if v.op == 0 {
						res = v1 & v2
					} else if v.op == 1 {
						res = v1 | v2
					} else {
						res = v1 ^ v2
					}
					val[i] = res
				}
				sum += val[i]
			}
			if bitVal == 0 {
				sum0 = sum
			} else {
				sum1 = sum
			}
		}

		if sum0 <= sum1 {
			minAns[j] = '0'
		} else {
			minAns[j] = '1'
		}

		if sum0 >= sum1 {
			maxAns[j] = '0'
		} else {
			maxAns[j] = '1'
		}
	}

	fmt.Println(string(minAns))
	fmt.Println(string(maxAns))
}