Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.80 KB | None | 0 0
  1. # Stepik, курс "Алгоритмы: теория и практика. Структуры данных", модуль 3, задача 2
  2. # Задача: Создать хэш-таблицу с цепочками с использованием кастомной функции хэширования (полином)
  3. # Вход: Размер хэш-таблицы m, количество запросов n, далее запросы типа "add string", "del string", "find string", "check i"
  4. # Выход: Для запроса find вывести "yes" или "no", для запроса check -- вывести указанную строку хэш-таблицы
  5.  
  6. from collections import deque
  7.  
  8. # Параметры хэширования. Чтобы не перерасчитывать значения степеней X, будем кэшировать их в массиве
  9. m, p, X = int(input()), 1000000007, [1, 263]
  10. hash_table = [deque() for _ in range(m)]
  11. for _ in range(int(input())):
  12. command, arg = input().split()
  13. if command == "check":
  14. print(' '.join(hash_table[int(arg)]))
  15. else:
  16. # Собственно, расчёт степеней Х, если это необходимо
  17. for _ in range(len(arg) - len(X)):
  18. X.append((X[-1] * X[1]) % p)
  19.  
  20. # Функция хэширования сводится к поэлементному суммированию произведений и взятию модулей
  21. chain = hash_table[sum(ord(c) * x for c, x in zip(arg, X)) % p % m]
  22. contains = arg in chain
  23. if command == "find":
  24. print("yes" if contains else "no")
  25. elif not contains and command == "add":
  26. chain.appendleft(arg)
  27. elif contains and command == "del":
  28. chain.remove(arg)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement