Advertisement
999ms

task I

Aug 13th, 2019
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.97 KB | None | 0 0
  1. from heapq import *
  2.  
  3. MSIZE = 1 << 8
  4. def GetVal(s):
  5.     ans = 0
  6.     for i in range(8):
  7.         if s[i] == '1':
  8.             ans = ans + (1 << i)
  9.     return ans
  10.  
  11. def GetNot(s):
  12.     return MSIZE - 1 - s;
  13.  
  14. xVal = GetVal('00001111')
  15. yVal = GetVal('00110011')
  16. zVal = GetVal('01010101')
  17.  
  18. # 0 - |
  19. # 1 - &
  20. # 2 - !
  21. # 3 - ()
  22.  
  23. def Dijkstra():
  24.     depth = [['Z' * 585 for i in range(4)] for i in range(MSIZE)]
  25.     depth[xVal][3] = 'x'
  26.     depth[yVal][3] = 'y'
  27.     depth[zVal][3] = 'z'
  28.  
  29.     pq = []
  30.     def push(kek):
  31.         heappush(pq, kek)
  32.     def pop():
  33.         return heappop(pq)
  34.     push([1, xVal, 3])
  35.     push([1, yVal, 3])
  36.     push([1, zVal, 3])
  37.     while len(pq) > 0:
  38.         l, i, j = pop();
  39.         if len(depth[i][j]) < l: continue
  40.         for x in range(MSIZE):
  41.             for y in range(4):
  42.                 nxt1 = depth[i][j] + '|' + depth[x][y]
  43.                 nxt2 = depth[x][y] + '|' + depth[i][j]
  44.                 nxt = min(nxt1, nxt2)
  45.                 val = (i | x)
  46.                 if len(depth[val][0]) == len(nxt) and depth[val][0] > nxt:
  47.                     depth[val][0] = nxt
  48.                     push([len(nxt), val, 0])
  49.                 elif len(depth[val][0]) > len(nxt):
  50.                     depth[val][0] = nxt
  51.                     push([len(nxt), val, 0])
  52.         if j > 0:
  53.             for x in range(MSIZE):
  54.                 for y in range(1, 4):
  55.                     nxt1 = depth[i][j] + '&' + depth[x][y]
  56.                     nxt2 = depth[x][y] + '&' + depth[i][j]
  57.                     nxt = min(nxt1, nxt2)
  58.                     val = (i & x)
  59.                     if len(depth[val][1]) == len(nxt) and depth[val][1] > nxt:
  60.                         depth[val][1] = nxt
  61.                         push([len(nxt), val, 1])
  62.                     elif len(depth[val][1]) > len(nxt):
  63.                         depth[val][1] = nxt
  64.                         push([len(nxt), val, 1])
  65.         if j > 2:
  66.             val = GetNot(i)
  67.             nxt = '!' + depth[i][j]
  68.             if len(depth[val][2]) == len(nxt) and depth[val][2] > nxt:
  69.                 depth[val][2] = nxt
  70.                 push([len(nxt), val, 2])
  71.             elif len(depth[val][2]) > len(nxt):
  72.                 depth[val][2] = nxt
  73.                 push([len(nxt), val, 2])
  74.         nxt = '(' + depth[i][j] + ')'
  75.         val = i
  76.         if len(depth[val][3]) == len(nxt) and depth[val][3] > nxt:
  77.             depth[val][3] = nxt
  78.             push([len(nxt), val, 3])
  79.         elif len(depth[val][3]) > len(nxt):
  80.             depth[val][3] = nxt
  81.             push([len(nxt), val, 3])
  82.     answer = []
  83.     for i in range(MSIZE):
  84.         ans = 'Z' * 585
  85.         for j in range(4):
  86.             if len(ans) > len(depth[i][j]):
  87.                 ans = depth[i][j]
  88.             elif len(ans) == len(depth[i][j]) and ans > depth[i][j]:
  89.                 ans = depth[i][j]
  90.         answer.append(ans)
  91.     return answer
  92. kek = Dijkstra()
  93.  
  94. q = int(input())
  95. for i in range(q):
  96.     print(kek[GetVal(input())])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement