#!/usr/bin/python3 # Formát vstupu: # Na prvním řádku počet formulářů. Potom jeden řádek pro každý formulář. # Ten může vypadat dvěma různými způsoby: # (a) Formulář bez závislostí: řádek obsahuje jediné číslo 0/1 udávající, # zda je vydáván kladně, nebo záporně vyplněný. # (b) Formulář se závislostmi: první slovo na řádku udává použitou logickou # funkci (and/or/xor), další slova jsou čísla požadovaných formulářů # (číslujeme od nuly). # # Příklad vstupu (pro graf z řešení, formulář 0 je A, 10 je K): # 11 # and 1 # or 2 # or 3 # xor 4 6 # and 1 2 # or 7 8 # and 8 9 # and 10 # 1 # 0 # 1 # # Příklad výstupu: # Formulář 0 nelze získat. # Formulář 1 nelze získat. # Formulář 2 nelze získat. # Formulář 3 nelze získat. # Formulář 4 nelze získat. # Formulář 5 lze získat kladně vyplněný. # Formulář 6 lze získat záporně vyplněný. # Formulář 7 lze získat kladně vyplněný. # Formulář 8 lze získat kladně vyplněný. # Formulář 9 lze získat záporně vyplněný. # Formulář 10 lze získat kladně vyplněný. # Pomocné hodnoty pro ohodnocení NEZNAME = -1 ROZPRACOVANE = -2 NELZE_ZISKAT = 2 N = int(input()) # počet formulářů Z = [[]]*N F = [None]*N H = [NEZNAME]*N def xor(hodnoty): # Exkluzivní nebo: pravdivé, pokud právě jeden argument je pravdivý # (viz poznámky na konci řešení). return hodnoty.count(1) == 1 FUNKCE = { 'and': all, # Využíváme vestavěné funkce Pythonu, které se chovají 'or': any, # přesně jako and/or, které potřebujeme. 'xor': xor } for i in range(N): # Na i-tém řádku jsou závislosti i-tého vrcholu. slova = input().split() funkce = slova[0].lower() # and, or, xor if funkce in ['0', '1']: # Stok (formulář bez závislostí) -- ohodnotíme rovnou. H[i] = int(funkce) else: # Jinak uložíme závislosti a logickou funkci. Z[i] = [ int(z) for z in slova[1:] ] F[i] = funkce def ohodnot(x): if H[x] == ROZPRACOVANE: # našli jsme cyklus H[x] = NELZE_ZISKAT return H[x] if H[x] != NEZNAME: # Již bylo spočítáno, vrať uloženou hodnotu. return H[x] H[x] = ROZPRACOVANE ohodnoceni_zav = [ ohodnot(z) for z in Z[x] ] if NELZE_ZISKAT in ohodnoceni_zav: H[x] = NELZE_ZISKAT else: H[x] = FUNKCE[F[x]](ohodnoceni_zav) return H[x] for x in range(N): h = ohodnot(x) if h == NELZE_ZISKAT: print("Formulář %d nelze získat." % x) else: print("Formulář %d lze získat %s vyplněný." % (x, ['záporně', 'kladně'][h]))