class MyHashSet:
def __init__(self):
self._length = 10000
self.arr = [None] * self._length
def add(self, key: int) -> None:
i = self.hashify(key)
while self.arr[i % self._length] is not None:
if self.arr[i % self._length] == key:
return
i += 1
self.arr[i] = key
def remove(self, key: int) -> None:
i = self.hashify(key)
while self.arr[i % self._length] is not None and self.arr[i % self._length] != key:
i += 1
self.arr[i] = None
def contains(self, key: int) -> bool:
i = self.hashify(key)
while self.arr[i % self._length] is not None:
if self.arr[i % self._length] == key:
return True
i += 1
return False
def hashify(self, key: int) -> int:
return key % self._length
# Your MyHashSet object will be instantiated and called as such:
# obj = MyHashSet()
# obj.add(key)
# obj.remove(key)
# param_3 = obj.contains(key)
Y2xhc3MgTXlIYXNoU2V0OgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9sZW5ndGggPSAxMDAwMAogICAgICAgIHNlbGYuYXJyID0gW05vbmVdICogc2VsZi5fbGVuZ3RoCgogICAgZGVmIGFkZChzZWxmLCBrZXk6IGludCkgLT4gTm9uZToKICAgICAgICBpID0gc2VsZi5oYXNoaWZ5KGtleSkKICAgICAgICB3aGlsZSBzZWxmLmFycltpICUgc2VsZi5fbGVuZ3RoXSBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgc2VsZi5hcnJbaSAlIHNlbGYuX2xlbmd0aF0gPT0ga2V5OgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGkgKz0gMQogICAgICAgIHNlbGYuYXJyW2ldID0ga2V5CgogICAgZGVmIHJlbW92ZShzZWxmLCBrZXk6IGludCkgLT4gTm9uZToKICAgICAgICBpID0gc2VsZi5oYXNoaWZ5KGtleSkKICAgICAgICB3aGlsZSBzZWxmLmFycltpICUgc2VsZi5fbGVuZ3RoXSBpcyBub3QgTm9uZSBhbmQgc2VsZi5hcnJbaSAlIHNlbGYuX2xlbmd0aF0gIT0ga2V5OgogICAgICAgICAgICBpICs9IDEKICAgICAgICBzZWxmLmFycltpXSA9IE5vbmUKICAgICAgICAKCiAgICBkZWYgY29udGFpbnMoc2VsZiwga2V5OiBpbnQpIC0+IGJvb2w6CiAgICAgICAgaSA9IHNlbGYuaGFzaGlmeShrZXkpCiAgICAgICAgd2hpbGUgc2VsZi5hcnJbaSAlIHNlbGYuX2xlbmd0aF0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIHNlbGYuYXJyW2kgJSBzZWxmLl9sZW5ndGhdID09IGtleToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGkgKz0gMQogICAgICAgIHJldHVybiBGYWxzZQogICAgZGVmIGhhc2hpZnkoc2VsZiwga2V5OiBpbnQpIC0+IGludDoKICAgICAgICByZXR1cm4ga2V5ICUgc2VsZi5fbGVuZ3RoCgoKIyBZb3VyIE15SGFzaFNldCBvYmplY3Qgd2lsbCBiZSBpbnN0YW50aWF0ZWQgYW5kIGNhbGxlZCBhcyBzdWNoOgojIG9iaiA9IE15SGFzaFNldCgpCiMgb2JqLmFkZChrZXkpCiMgb2JqLnJlbW92ZShrZXkpCiMgcGFyYW1fMyA9IG9iai5jb250YWlucyhrZXkp