|
- import sys
-
-
- text = sys.stdin.read()
- test = '''mxmxvkd kfcds sqjhc nhms (contains dairy, fish)
- trh fvjkl sbzzf mxmxvkd (contains dairy)
- sqjhc fvjkl (contains soy)
- sqjhc mxmxvkd sbzzf (contains fish)'''
-
-
- contains = {}
- for line in text.splitlines():
- food, allergens = line[:-1].split(' (contains ')
- food = frozenset(s.strip() for s in food.split(' '))
- allergens = frozenset(s.strip() for s in allergens.split(','))
- contains[food] = allergens
-
- all_allergens = {a for b in contains.values() for a in b}
- all_foods = {a for b in contains.keys() for a in b}
-
- reverse = {}
- for food in all_foods:
- reverse[food] = set(all_allergens)
-
- for food, allergens in contains.items():
- for f2 in reverse:
- if f2 not in food:
- reverse[f2] -= allergens
-
- clean = {k for k, v in reverse.items() if not v}
- ans = 0
- for v in contains.keys():
- ans += len(v & clean)
- print(ans)
-
-
- final = {v: k - clean for k, v in contains.items()}
-
-
- def recurse(ings, known=tuple()):
- if not ings:
- yield known
- else:
- key, = min(ings, key=lambda k: len(k))
- for val in sorted(ings.pop(frozenset({key}))):
- expa = known + ((key, val),)
- lob = {k - {key}: v - {val} for k, v in ings.items()}
- yield from recurse(lob, expa)
-
-
- for out in recurse(dict(final)):
- d = dict(out)
- if all(({d[e] for e in k} <= set(v)) for k, v in final.items()):
- print(','.join(v for _, v in sorted(out)))
|