Резюме: Есть ли способ сделать это? Вот что я имею в виду: предположим, что у меня есть unsigned int. Затем я умножаю его несколько раз (и там переполнение , которое ожидается). Тогда можно ли "вернуть" исходное значение назад?
Подробнее:
Все о Rab-Karp hash. Мне нужно сделать следующее: у меня есть хэш длинной строки - например: "abcd" . Тогда у меня есть хэш для более короткой подстроки - например, "cd". Как вычислить хэш "ab" с помощью O (1), используя две заданные хэши?
Теперь у меня есть алгоритм:
- вычесть хеш "cd" из хэша "abcd" (удалить последние элементы из многочлена)
- разделите хэширование "abcd" на
p ^ len( "cd" )
, гдеp
- базовое (простое число).
Итак, это:
a * p ^ 3 + b * p ^ 2 + c * p ^ 1 + d * p ^ 0
- abcd
c * p ^ 1 + d * p ^ 0
- cd
ab получает:
( ( a * p ^ 3 + b * p ^ 2 + c * p ^ 1 + d * p ^ 0 ) - ( c * p ^ 1 + d * p ^ 0 ) ) / ( p ^ 2 ) = a * p ^ 1 + b * p ^ 0
И это работает, если у меня нет переполнения (если p
- небольшое число). Но если это не так - это не работает.
Есть ли какой-нибудь трюк или что-то еще?
P.S. Тег c++
происходит из-за переполнения числа, поскольку он специфичен (и отличается от python, схемы или sth)