您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

55 行
1.4KB

  1. import sys
  2. text = sys.stdin.read()
  3. test = '''mxmxvkd kfcds sqjhc nhms (contains dairy, fish)
  4. trh fvjkl sbzzf mxmxvkd (contains dairy)
  5. sqjhc fvjkl (contains soy)
  6. sqjhc mxmxvkd sbzzf (contains fish)'''
  7. contains = {}
  8. for line in text.splitlines():
  9. food, allergens = line[:-1].split(' (contains ')
  10. food = frozenset(s.strip() for s in food.split(' '))
  11. allergens = frozenset(s.strip() for s in allergens.split(','))
  12. contains[food] = allergens
  13. all_allergens = {a for b in contains.values() for a in b}
  14. all_foods = {a for b in contains.keys() for a in b}
  15. reverse = {}
  16. for food in all_foods:
  17. reverse[food] = set(all_allergens)
  18. for food, allergens in contains.items():
  19. for f2 in reverse:
  20. if f2 not in food:
  21. reverse[f2] -= allergens
  22. clean = {k for k, v in reverse.items() if not v}
  23. ans = 0
  24. for v in contains.keys():
  25. ans += len(v & clean)
  26. print(ans)
  27. final = {v: k - clean for k, v in contains.items()}
  28. def recurse(ings, known=tuple()):
  29. if not ings:
  30. yield known
  31. else:
  32. key, = min(ings, key=lambda k: len(k))
  33. for val in sorted(ings.pop(frozenset({key}))):
  34. expa = known + ((key, val),)
  35. lob = {k - {key}: v - {val} for k, v in ings.items()}
  36. yield from recurse(lob, expa)
  37. for out in recurse(dict(final)):
  38. d = dict(out)
  39. if all(({d[e] for e in k} <= set(v)) for k, v in final.items()):
  40. print(','.join(v for _, v in sorted(out)))