summaryrefslogtreecommitdiff
path: root/sources/hash_chains.py
diff options
context:
space:
mode:
Diffstat (limited to 'sources/hash_chains.py')
-rw-r--r--sources/hash_chains.py68
1 files changed, 68 insertions, 0 deletions
diff --git a/sources/hash_chains.py b/sources/hash_chains.py
new file mode 100644
index 0000000..cbd0fbb
--- /dev/null
+++ b/sources/hash_chains.py
@@ -0,0 +1,68 @@
+# python3
+
+
+class Query:
+
+ def __init__(self, query):
+ self.type = query[0]
+ if self.type == 'check':
+ self.ind = int(query[1])
+ else:
+ self.s = query[1]
+
+
+class QueryProcessor:
+ _multiplier = 263
+ _prime = 1000000007
+
+ def __init__(self, bucket_count):
+ self.bucket_count = bucket_count
+ # store all strings in one list
+ self.elems = []
+
+ def hash_func(self, s):
+ ans = 0
+ for c in reversed(s):
+ ans = (ans * self._multiplier + ord(c)) % self._prime
+ return ans % self.bucket_count
+
+ def write_search_result(self, was_found):
+ print('yes' if was_found else 'no')
+
+ def write_chain(self, chain):
+ print(' '.join(chain))
+
+ def read_query(self):
+ return Query(input().split())
+
+ def process_query(self, query):
+ if query.type == "check":
+ # use reverse order, because we append strings to the end
+ self.write_chain(cur for cur in reversed(self.elems[query.ind]))
+ else:
+ try:
+ ind = self.hash_func(query.s)
+ except ValueError:
+ ind = -1
+ if query.type == 'find':
+ self.write_search_result(query.s in self.elems[ind])
+ elif query.type == 'add':
+ if query.s not in self.elems[ind]:
+ self.elems[ind].append(query.s)
+ else:
+ try:
+ self.elems[ind].remove(query.s)
+ except ValueError:
+ pass
+
+ def process_queries(self):
+ n = int(input())
+ self.elems = [[] for i in range(n)]
+ for i in range(n):
+ self.process_query(self.read_query())
+
+
+if __name__ == '__main__':
+ bucket_count = int(input())
+ proc = QueryProcessor(bucket_count)
+ proc.process_queries()