Skip to content

Commit 50c5cc9

Browse files
committed
Add hash-functions and trees
1 parent 4099bae commit 50c5cc9

File tree

7 files changed

+423
-8
lines changed

7 files changed

+423
-8
lines changed

README.md

Lines changed: 273 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
# Алгоритмы и струткуры данных
1+
# Алгоритмы и структуры данных
22

33
## Введение в алгоритмы с финальными задачами.
44

5-
---
6-
75
<details>
86
<summary>
97
<b>Значения функции (<a href="intro_algorithms/a_function_values.py">a_function_values.py</a></b>)
108
</summary>
119

1210
#### Условие:
1311
[Ссылка](https://contest.yandex.ru/contest/23389/problems/A/)
12+
1413
Вася делает тест по математике: вычисляет значение функций в различных точках.
1514
Стоит отличная погода, и друзья зовут Васю гулять. Но мальчик решил сначала
1615
закончить тест и только после этого идти к друзьям. К сожалению, Вася пока
@@ -52,6 +51,7 @@
5251

5352
#### Условие:
5453
[Ссылка](https://contest.yandex.ru/contest/23389/problems/B/)
54+
5555
Представьте себе онлайн-игру для поездки в метро: игрок нажимает на кнопку,
5656
и на экране появляются три случайных числа. Если все три числа оказываются
5757
одной чётности, игрок выигрывает.
@@ -91,6 +91,7 @@
9191

9292
#### Условие:
9393
[Ссылка](https://contest.yandex.ru/contest/23389/problems/C/)
94+
9495
Дана матрица. Нужно написать функцию, которая для элемента возвращает
9596
всех его соседей. Соседним считается элемент, находящийся от текущего
9697
на одну ячейку влево, вправо, вверх или вниз. Диагональные элементы
@@ -143,6 +144,7 @@
143144

144145
#### Условие:
145146
[Ссылка](https://contest.yandex.ru/contest/23389/problems/D/)
147+
146148
Метеорологическая служба вашего города решила исследовать погоду новым способом.
147149
Под температурой воздуха в конкретный день будем понимать максимальную
148150
температуру в этот день.
@@ -191,6 +193,7 @@
191193

192194
#### Условие:
193195
[Ссылка](https://contest.yandex.ru/contest/23389/problems/E/)
196+
194197
Чтобы подготовиться к семинару, Гоше надо прочитать статью по эффективному
195198
менеджменту. Так как Гоша хочет спланировать день заранее, ему необходимо
196199
оценить сложность статьи.
@@ -236,6 +239,7 @@
236239

237240
#### Условие:
238241
[Ссылка](https://contest.yandex.ru/contest/23389/problems/F/)
242+
239243
Помогите Васе понять, будет ли фраза палиндромом. Учитываются только буквы и
240244
цифры, заглавные и строчные буквы считаются одинаковыми.
241245

@@ -277,6 +281,7 @@
277281

278282
#### Условие:
279283
[Ссылка](https://contest.yandex.ru/contest/23389/problems/G/)
284+
280285
Вася реализовал функцию, которая переводит целое число из десятичной системы в
281286
двоичную. Но, кажется, она получилась не очень оптимальной.
282287
Попробуйте написать более эффективную программу.
@@ -634,8 +639,6 @@
634639

635640
## Основные структуры данных с финальными задачами.
636641

637-
---
638-
639642
<details>
640643
<summary>
641644
<b>Мониторинг (<a href="basic_data_structures/a_monitoring.py">a_monitoring.py</a></b>)
@@ -1254,8 +1257,6 @@ Value — целое число, по модулю не превосходяще
12541257

12551258
## Рекурсии и сортировки с финальными задачами.
12561259

1257-
---
1258-
12591260
<details>
12601261
<summary>
12611262
<b>Генератор скобок (<a href="recursion_and_sorting/a_gen_bracket.py">a_gen_bracket.py</a></b>)
@@ -1935,4 +1936,268 @@ Fi и Pi — целые числа, лежащие в диапазоне от 0
19351936

19361937
</details>
19371938

1938-
---
1939+
---
1940+
1941+
## Хеш-функции
1942+
1943+
1944+
<details>
1945+
<summary>
1946+
<b>Полиномиальный хеш (<a href="hash-finctions/a_Polynomial_hash.py">a_Polynomial_hash.py</a></b>)
1947+
</summary>
1948+
1949+
#### Условие:
1950+
[Ссылка](https://contest.yandex.ru/contest/26205/problems/A/)
1951+
1952+
Алле очень понравился алгоритм вычисления полиномиального хеша. Помогите ей написать функцию, вычисляющую хеш строки s. В данной задаче необходимо использовать в качестве значений отдельных символов их коды в таблице ASCII.
1953+
Полиномиальный хеш считается по формуле:
1954+
1955+
`h(s) = (s1a^n-1 + s2a^n-2 + ... + sn-1a + sn) mod m`
1956+
1957+
#### Формат ввода
1958+
В первой строке дано число a (1 ≤ a ≤ 1000) –— основание, по которому считается хеш.
1959+
1960+
Во второй строке дано число m (1 ≤ m ≤ 109) –— модуль.
1961+
1962+
В третьей строке дана строка s (0 ≤ |s| ≤ 106), состоящая из больших и маленьких латинских букв.
1963+
1964+
#### Формат вывода
1965+
Выведите целое неотрицательное число –— хеш заданной строки.
1966+
1967+
#### Пример
1968+
<table><tbody>
1969+
<tr>
1970+
<td><b>Ввод</b></td>
1971+
<td><b>Вывод</b></td>
1972+
</tr>
1973+
<tr>
1974+
<td valign="top">
1975+
123<br>
1976+
100003<br>
1977+
a<br>
1978+
</td>
1979+
<td valign="top">
1980+
97<br>
1981+
</td>
1982+
</tr>
1983+
</tbody></table>
1984+
1985+
</details>
1986+
1987+
---
1988+
1989+
<details>
1990+
<summary>
1991+
<b>Сломай меня (<a href="hash-finctions/b_crash_polynomial_hash.py">b_crash_polynomial_hash.py</a></b>)
1992+
</summary>
1993+
1994+
#### Условие:
1995+
[Ссылка](https://contest.yandex.ru/contest/26205/problems/B/)
1996+
1997+
Гоша написал программу, которая сравнивает строки исключительно по их хешам. Если хеш равен, то и строки равны. Тимофей увидел это безобразие и поручил вам сломать программу Гоши, чтобы остальным неповадно было.
1998+
1999+
В этой задаче вам надо будет лишь найти две различные строки, которые для заданной хеш-функции будут давать одинаковое значение.
2000+
2001+
`h(s) = (s1a^n-1 + s2a^n-2 + ... + sn-1a + sn) mod m`
2002+
2003+
для a = 1000 и m = 123 987 123.
2004+
В данной задаче необходимо использовать в качестве значений отдельных символов их коды в таблице ASCII.
2005+
#### Формат ввода
2006+
В задаче единственный тест без ввода
2007+
2008+
#### Формат вывода
2009+
Отправьте две строки, по одной в строке. Строки могут состоять только из маленьких латинских букв и не должны превышать в длину 1000 знаков каждая. Код отправлять не требуется. Строки из примера использовать нельзя.
2010+
2011+
Пример вывода:
2012+
2013+
ezhgeljkablzwnvuwqvp
2014+
2015+
gbpdcvkumyfxillgnqrv
2016+
2017+
#### Пример
2018+
<table><tbody>
2019+
<tr>
2020+
<td><b>Ввод</b></td>
2021+
<td><b>Вывод</b></td>
2022+
</tr>
2023+
<tr>
2024+
<td valign="top">
2025+
<br>
2026+
</td>
2027+
<td valign="top">
2028+
<br>
2029+
</td>
2030+
</tr>
2031+
</tbody></table>
2032+
2033+
</details>
2034+
2035+
---
2036+
2037+
<details>
2038+
<summary>
2039+
<b>Префиксные хеши (<a href="hash-finctions/c_prefix_hash.py">.py</a></b>)
2040+
</summary>
2041+
2042+
#### Условие:
2043+
[Ссылка](https://contest.yandex.ru/contest/26205/problems/C/)
2044+
2045+
Алла не остановилась на достигнутом –— теперь она хочет научиться быстро вычислять хеши произвольных подстрок данной строки. Помогите ей!
2046+
На вход поступают запросы на подсчёт хешей разных подстрок. Ответ на каждый запрос должен выполняться за O(1). Допустимо в начале работы программы сделать предподсчёт для дальнейшей работы со строкой.
2047+
Напомним, что полиномиальный хеш считается по формуле
2048+
2049+
`h(s) = (s1a^n-1 + s2a^n-2 + ... + sn-1a + sn) mod m`
2050+
2051+
#### Формат ввода
2052+
В первой строке дано число a (1 ≤ a ≤ 1000) –— основание, по которому считается хеш. Во второй строке дано число m (1 ≤ m ≤ 10^7) –— модуль. В третьей строке дана строка s (0 ≤ |s| ≤ 10^6), состоящая из больших и маленьких латинских букв.
2053+
2054+
В четвертой строке дано число запросов t –— натуральное число от 1 до 10^5. В каждой из следующих t строк записаны через пробел два числа l и r –— индексы начала и конца очередной подстроки. (1 ≤ l ≤ r ≤ |s|).
2055+
2056+
#### Формат вывода
2057+
Для каждого запроса выведите на отдельной строке хеш заданной в запросе подстроки.
2058+
2059+
#### Пример
2060+
<table><tbody>
2061+
<tr>
2062+
<td><b>Ввод</b></td>
2063+
<td><b>Вывод</b></td>
2064+
</tr>
2065+
<tr>
2066+
<td valign="top">
2067+
1000<br>
2068+
1000009<br>
2069+
abcdefgh<br>
2070+
7<br>
2071+
1 1<br>
2072+
1 5<br>
2073+
2 3<br>
2074+
3 4<br>
2075+
4 4<br>
2076+
1 8<br>
2077+
5 8<br>
2078+
</td>
2079+
<td valign="top">
2080+
97<br>
2081+
225076<br>
2082+
98099<br>
2083+
99100<br>
2084+
100<br>
2085+
436420<br>
2086+
193195<br>
2087+
</td>
2088+
</tr>
2089+
</tbody></table>
2090+
2091+
</details>
2092+
2093+
---
2094+
2095+
<details>
2096+
<summary>
2097+
<b>Кружки (<a href="hash-finctions/d_sections.py">d_sections.py</a></b>)
2098+
</summary>
2099+
2100+
#### Условие:
2101+
[Ссылка](https://contest.yandex.ru/contest/26205/problems/D/)
2102+
2103+
В компании, где работает Тимофей, заботятся о досуге сотрудников и устраивают различные кружки по интересам. Когда кто-то записывается на занятие, в лог вносится название кружка.
2104+
2105+
По записям в логе составьте список всех кружков, в которые ходит хотя бы один человек.
2106+
2107+
#### Формат ввода
2108+
В первой строке даётся натуральное число n, не превосходящее 10 000 –— количество записей в логе.
2109+
2110+
В следующих n строках —– названия кружков.
2111+
2112+
#### Формат вывода
2113+
Выведите уникальные названия кружков по одному на строке, в порядке появления во входных данных.
2114+
2115+
#### Пример
2116+
<table><tbody>
2117+
<tr>
2118+
<td><b>Ввод</b></td>
2119+
<td><b>Вывод</b></td>
2120+
</tr>
2121+
<tr>
2122+
<td valign="top">
2123+
8<br>
2124+
вышивание крестиком<br>
2125+
рисование мелками на парте<br>
2126+
настольный керлинг<br>
2127+
настольный керлинг<br>
2128+
кухня африканского племени ужасмай<br>
2129+
тяжелая атлетика<br>
2130+
таракановедение<br>
2131+
таракановедение<br>
2132+
</td>
2133+
<td valign="top">
2134+
вышивание крестиком<br>
2135+
рисование мелками на парте<br>
2136+
настольный керлинг<br>
2137+
кухня африканского племени ужасмай<br>
2138+
тяжелая атлетика<br>
2139+
таракановедение<br>
2140+
</td>
2141+
</tr>
2142+
</tbody></table>
2143+
2144+
</details>
2145+
2146+
---
2147+
2148+
<details>
2149+
<summary>
2150+
<b>Подстроки (<a href="hash-finctions/e_substring.py">e_substring.py</a></b>)
2151+
</summary>
2152+
2153+
#### Условие:
2154+
[Ссылка](https://contest.yandex.ru/contest/26205/problems/E/)
2155+
2156+
На вход подается строка. Нужно определить длину наибольшей подстроки, которая не содержит повторяющиеся символы.
2157+
2158+
#### Формат ввода
2159+
Одна строка, состоящая из строчных латинских букв. Длина строки не превосходит 10 000.
2160+
2161+
#### Формат вывода
2162+
Выведите натуральное число —– ответ на задачу.
2163+
2164+
#### Пример
2165+
<table><tbody>
2166+
<tr>
2167+
<td><b>Ввод</b></td>
2168+
<td><b>Вывод</b></td>
2169+
</tr>
2170+
<tr>
2171+
<td valign="top">
2172+
abcabcbb<br>
2173+
</td>
2174+
<td valign="top">
2175+
3<br>
2176+
</td>
2177+
</tr>
2178+
</tbody></table>
2179+
2180+
</details>
2181+
2182+
---
2183+
2184+
## Деревья
2185+
2186+
2187+
<details>
2188+
<summary>
2189+
<b>Лампочки (<a href="trees/a_lamps.py">a_lamps.py</a></b>)
2190+
</summary>
2191+
2192+
#### Условие:
2193+
[Ссылка](https://contest.yandex.ru/contest/26207/problems/A/)
2194+
2195+
Гоша повесил на стену гирлянду в виде бинарного дерева, в узлах которого находятся лампочки. У каждой лампочки есть своя яркость. Уровень яркости лампочки соответствует числу, расположенному в узле дерева. Помогите Гоше найти самую яркую лампочку в гирлянде, то есть такую, у которой яркость наибольшая.
2196+
2197+
#### Формат ввода
2198+
На вход подается корень дерева.
2199+
2200+
#### Формат вывода
2201+
Функция должна вернуть максимальное значение яркости в узле дерева.
2202+
2203+
</details>

hash-finctions/a_Polynomial_hash.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
def hash_string(a, m, istring):
2+
tmp = ord(istring[-1])
3+
lenght = a
4+
for c in istring[-2::-1]:
5+
tmp = (tmp + ord(c) * lenght)
6+
lenght = (lenght * a) % m
7+
print(tmp % m)
8+
9+
10+
if __name__ == '__main__':
11+
a = int(input())
12+
m = int(input())
13+
input_string = input()
14+
if input_string == '':
15+
print(0)
16+
else:
17+
hash_string(a, m, input_string)

0 commit comments

Comments
 (0)