# your code goes here
class HashMap:
def __init__(self,m):
self.m=m
self.map=[0]*m
self.frq=[0]*m
self.state=[0]*m
def hash_function(self,k):
return k%self.m
def insert(self,k):
id=self.hash_function(k)
while self.state[id]!=0:
if self.map[id]==k:
self.frq[id]+=1
self.state[id]=1
return
id=(id+1)%self.m
self.map[id]=k
self.state[id]=1
self.frq[id]+=1
def search(self,k):
id=self.hash_function(k)
while self.map[id]!=k:
if self.state[id]==0 or self.state[id]==-1:
return False
id=(id+1)%self.m
if self.map[id]==k and self.state[id]==1:
return True
return False
def delete(self,k):
if self.search(k):
id=self.hash_function(k)
while self.map[id]!=k:
id=(id+1)%self.m
self.frq[id]-=1
self.state[id]=-1
return True
return False
def display(self):
print(f"{'Index':<7}{'Key':<7}{'State':<7}{'Freq':<7}")
print("-"*28)
for i in range(self.m):
print(f"{i:<7}{self.map[i]:<7}{self.state[i]:<7}{self.frq[i]:<7}")
hm=HashMap(10)
hm.insert(5)
hm.insert(12)
hm.insert(19)
hm.insert(26)
hm.insert(33)
print(hm.delete(19))
print(hm.delete(40))
print(hm.search(26))
hm.display()
IyB5b3VyIGNvZGUgZ29lcyBoZXJlCmNsYXNzIEhhc2hNYXA6CiAgICBkZWYgX19pbml0X18oc2VsZixtKToKICAgICAgICBzZWxmLm09bQogICAgICAgIHNlbGYubWFwPVswXSptCiAgICAgICAgc2VsZi5mcnE9WzBdKm0KICAgICAgICBzZWxmLnN0YXRlPVswXSptCiAgICBkZWYgaGFzaF9mdW5jdGlvbihzZWxmLGspOgogICAgICAgIHJldHVybiBrJXNlbGYubQogICAgZGVmIGluc2VydChzZWxmLGspOgogICAgICAgIGlkPXNlbGYuaGFzaF9mdW5jdGlvbihrKQogICAgICAgIHdoaWxlIHNlbGYuc3RhdGVbaWRdIT0wOgogICAgICAgICAgICBpZiBzZWxmLm1hcFtpZF09PWs6CiAgICAgICAgICAgICAgICBzZWxmLmZycVtpZF0rPTEKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVbaWRdPTEKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBpZD0oaWQrMSklc2VsZi5tCiAgICAgICAgc2VsZi5tYXBbaWRdPWsKICAgICAgICBzZWxmLnN0YXRlW2lkXT0xCiAgICAgICAgc2VsZi5mcnFbaWRdKz0xCiAgICBkZWYgc2VhcmNoKHNlbGYsayk6CiAgICAgICAgaWQ9c2VsZi5oYXNoX2Z1bmN0aW9uKGspCiAgICAgICAgd2hpbGUgc2VsZi5tYXBbaWRdIT1rOgogICAgICAgICAgICBpZiBzZWxmLnN0YXRlW2lkXT09MCBvciBzZWxmLnN0YXRlW2lkXT09LTE6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgaWQ9KGlkKzEpJXNlbGYubQogICAgICAgIGlmIHNlbGYubWFwW2lkXT09ayBhbmQgc2VsZi5zdGF0ZVtpZF09PTE6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBkZWYgZGVsZXRlKHNlbGYsayk6CiAgICAgICAgaWYgc2VsZi5zZWFyY2goayk6CiAgICAgICAgICAgIGlkPXNlbGYuaGFzaF9mdW5jdGlvbihrKQogICAgICAgICAgICB3aGlsZSBzZWxmLm1hcFtpZF0hPWs6CiAgICAgICAgICAgICAgICBpZD0oaWQrMSklc2VsZi5tCiAgICAgICAgICAgIHNlbGYuZnJxW2lkXS09MQogICAgICAgICAgICBzZWxmLnN0YXRlW2lkXT0tMQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQogICAgZGVmIGRpc3BsYXkoc2VsZik6CiAgICAgICAgcHJpbnQoZiJ7J0luZGV4Jzo8N317J0tleSc6PDd9eydTdGF0ZSc6PDd9eydGcmVxJzo8N30iKQogICAgICAgIHByaW50KCItIioyOCkKICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLm0pOgogICAgICAgICAgICBwcmludChmIntpOjw3fXtzZWxmLm1hcFtpXTo8N317c2VsZi5zdGF0ZVtpXTo8N317c2VsZi5mcnFbaV06PDd9IikKCmhtPUhhc2hNYXAoMTApCmhtLmluc2VydCg1KQpobS5pbnNlcnQoMTIpCmhtLmluc2VydCgxOSkKaG0uaW5zZXJ0KDI2KQpobS5pbnNlcnQoMzMpCgpwcmludChobS5kZWxldGUoMTkpKQpwcmludChobS5kZWxldGUoNDApKQoKcHJpbnQoaG0uc2VhcmNoKDI2KSkKCmhtLmRpc3BsYXkoKQo=