class bloom:
def __init__(self):
self.__data = 0
def add(self, element):
self.__data |= element
def possibly_contains(self, element):
return bool(self.__data & element)
class uniquelist:
def __init__(self):
self.__index = bloom()
self.__elements = []
def append(self, element):
if element in self:
return
self.__index.add(hash(element))
self.__elements.append(element)
def extend(self, elements):
for element in elements:
self.append(element)
def __contains__(self, element):
if self.__index.possibly_contains(hash(element)):
return element in self.__elements
return False
def __len__(self):
return len(self.__elements)
def __iter__(self):
return iter(self.__elements)
xs = uniquelist()
xs.append(1)
xs.append(2)
xs.append(3)
xs.append(3)
xs.append(4)
for x in xs:
print(x)
Y2xhc3MgYmxvb206CglkZWYgX19pbml0X18oc2VsZik6CgkJc2VsZi5fX2RhdGEgPSAwCgoJZGVmIGFkZChzZWxmLCBlbGVtZW50KToKCQlzZWxmLl9fZGF0YSB8PSBlbGVtZW50CgoJZGVmIHBvc3NpYmx5X2NvbnRhaW5zKHNlbGYsIGVsZW1lbnQpOgoJCXJldHVybiBib29sKHNlbGYuX19kYXRhICYgZWxlbWVudCkKCmNsYXNzIHVuaXF1ZWxpc3Q6CglkZWYgX19pbml0X18oc2VsZik6CgkJc2VsZi5fX2luZGV4ID0gYmxvb20oKQoJCXNlbGYuX19lbGVtZW50cyA9IFtdCgoJZGVmIGFwcGVuZChzZWxmLCBlbGVtZW50KToKCQlpZiBlbGVtZW50IGluIHNlbGY6CgkJCXJldHVybgoJCXNlbGYuX19pbmRleC5hZGQoaGFzaChlbGVtZW50KSkKCQlzZWxmLl9fZWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpCgoJZGVmIGV4dGVuZChzZWxmLCBlbGVtZW50cyk6CgkJZm9yIGVsZW1lbnQgaW4gZWxlbWVudHM6CgkJCXNlbGYuYXBwZW5kKGVsZW1lbnQpCgoJZGVmIF9fY29udGFpbnNfXyhzZWxmLCBlbGVtZW50KToKCQlpZiBzZWxmLl9faW5kZXgucG9zc2libHlfY29udGFpbnMoaGFzaChlbGVtZW50KSk6CgkJCXJldHVybiBlbGVtZW50IGluIHNlbGYuX19lbGVtZW50cwoJCXJldHVybiBGYWxzZQoKCWRlZiBfX2xlbl9fKHNlbGYpOgoJCXJldHVybiBsZW4oc2VsZi5fX2VsZW1lbnRzKQoKCWRlZiBfX2l0ZXJfXyhzZWxmKToKCQlyZXR1cm4gaXRlcihzZWxmLl9fZWxlbWVudHMpCgp4cyA9IHVuaXF1ZWxpc3QoKQp4cy5hcHBlbmQoMSkKeHMuYXBwZW5kKDIpCnhzLmFwcGVuZCgzKQp4cy5hcHBlbmQoMykKeHMuYXBwZW5kKDQpCmZvciB4IGluIHhzOgoJcHJpbnQoeCk=