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()
Y2xhc3MgSGFzaE1hcDoKICAgIGRlZiBfX2luaXRfXyhzZWxmLG0pOgogICAgICAgIHNlbGYubT1tCiAgICAgICAgc2VsZi5tYXA9WzBdKm0KICAgICAgICBzZWxmLmZycT1bMF0qbQogICAgICAgIHNlbGYuc3RhdGU9WzBdKm0KICAgIGRlZiBoYXNoX2Z1bmN0aW9uKHNlbGYsayk6CiAgICAgICAgcmV0dXJuIGslc2VsZi5tCiAgICBkZWYgaW5zZXJ0KHNlbGYsayk6CiAgICAgICAgaWQ9c2VsZi5oYXNoX2Z1bmN0aW9uKGspCiAgICAgICAgd2hpbGUgc2VsZi5zdGF0ZVtpZF0hPTA6CiAgICAgICAgICAgIGlmIHNlbGYubWFwW2lkXT09azoKICAgICAgICAgICAgICAgIHNlbGYuZnJxW2lkXSs9MQogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZVtpZF09MQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGlkPShpZCsxKSVzZWxmLm0KICAgICAgICBzZWxmLm1hcFtpZF09awogICAgICAgIHNlbGYuc3RhdGVbaWRdPTEKICAgICAgICBzZWxmLmZycVtpZF0rPTEKICAgIGRlZiBzZWFyY2goc2VsZixrKToKICAgICAgICBpZD1zZWxmLmhhc2hfZnVuY3Rpb24oaykKICAgICAgICB3aGlsZSBzZWxmLm1hcFtpZF0hPWs6CiAgICAgICAgICAgIGlmIHNlbGYuc3RhdGVbaWRdPT0wIG9yIHNlbGYuc3RhdGVbaWRdPT0tMToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICBpZD0oaWQrMSklc2VsZi5tCiAgICAgICAgaWYgc2VsZi5tYXBbaWRdPT1rIGFuZCBzZWxmLnN0YXRlW2lkXT09MToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKICAgIGRlZiBkZWxldGUoc2VsZixrKToKICAgICAgICBpZiBzZWxmLnNlYXJjaChrKToKICAgICAgICAgICAgaWQ9c2VsZi5oYXNoX2Z1bmN0aW9uKGspCiAgICAgICAgICAgIHdoaWxlIHNlbGYubWFwW2lkXSE9azoKICAgICAgICAgICAgICAgIGlkPShpZCsxKSVzZWxmLm0KICAgICAgICAgICAgc2VsZi5mcnFbaWRdLT0xCiAgICAgICAgICAgIHNlbGYuc3RhdGVbaWRdPS0xCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBkZWYgZGlzcGxheShzZWxmKToKICAgICAgICBwcmludChmInsnSW5kZXgnOjw3fXsnS2V5Jzo8N317J1N0YXRlJzo8N317J0ZyZXEnOjw3fSIpCiAgICAgICAgcHJpbnQoIi0iKjI4KQogICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYubSk6CiAgICAgICAgICAgIHByaW50KGYie2k6PDd9e3NlbGYubWFwW2ldOjw3fXtzZWxmLnN0YXRlW2ldOjw3fXtzZWxmLmZycVtpXTo8N30iKQoKaG09SGFzaE1hcCgxMCkKaG0uaW5zZXJ0KDUpCmhtLmluc2VydCgxMikKaG0uaW5zZXJ0KDE5KQpobS5pbnNlcnQoMjYpCmhtLmluc2VydCgzMykKCnByaW50KGhtLmRlbGV0ZSgxOSkpCnByaW50KGhtLmRlbGV0ZSg0MCkpCgpwcmludChobS5zZWFyY2goMjYpKQoKaG0uZGlzcGxheSgpCg==