Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- class UFDS:
- def __init__(self, n):
- self.arr = list(range(n))
- def union(self, i, j):
- temp = self.arr[i]
- for i in range(len(self.arr)):
- if self.arr[i] == temp:
- self.arr[i] = self.arr[j]
- def find(self, i, j):
- return self.arr[i] == self.arr[j]
- def numComponents(self):
- counted = set()
- for item in self.arr: counted.add(item)
- return len(counted)
- def elementsOfA(self):
- temp = self.arr[0]
- result = ""
- for i in range(len(self.arr)):
- if self.arr[i] == temp:
- result += ALPHABET[i]
- return result
- def convert(hexString):
- return bin(int(hexString, 16))[2:].rjust(len(hexString)*4, "0")
- def parseBinString(n, s):
- length = n-1
- edges = []
- while length > 0:
- v = n - length - 1
- for i in range(length):
- if s[i]=='1': edges.append((v, v+i+1))
- ## print(s[:length])
- s = s[length:]
- length-=1
- return edges
- lines = open('components.in', 'r').readlines()
- for line in lines:
- items = line.strip().split()
- n, s = int(items[0]), convert(items[1])
- ufds = UFDS(n)
- edges = parseBinString(n, s)
- ## print(s)
- ## print(edges)
- for (v, w) in edges:
- ufds.union(v, w)
- print(ufds.numComponents(), ufds.elementsOfA())
Add Comment
Please, Sign In to add comment