Резюме: Есть ли способ сделать это? Вот что я имею в виду: предположим, у меня есть число unsigned int. Затем я умножаю его несколько раз (и происходит переполнение, что и ожидается). Тогда можно ли «вернуть» исходное значение обратно?
Подробно:
Все дело в катящемся хеше Рабина-Карпа. Что мне нужно сделать, так это: у меня есть хэш длинной строки, например: «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
- кд
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, схемы или чего-либо)
p = 2
это невозможно. Для всех остальных простых чиселp
возможно... - person Sven Marnach   schedule 07.05.2011p
), и снова вычитать предпоследнюю букву и снова делить наp
и т.д., так как не знаю строк, а только их хеш.. - person Kiril Kirov   schedule 07.05.2011