Хеширование строк: различия между версиями

Материал из Олимпиадное программирование в УлГТУ
Перейти к навигации Перейти к поиску
Нет описания правки
Строка 1: Строка 1:
== Ссылки на задачи ==
unsigned long long X = 31, p[100010], h[100010];
* [[ACMP 259|ACMP #259 — A-функция от строчки]]
* [[ACMP 595|ACMP #595 — Слова]]
void buildHash(char *s) {
    p[0] = 1;
    h[0] = s[0] - 'a';
    for (int i = 1; s[i]; i++) {
        p[i] = p[i - 1] * X;
        h[i] = h[i - 1] + p[i] * (s[i] - 'a');
    }
}
bool areEqual(int l1, int r1, int l2, int r2) {
    unsigned long long h1 = h[r1] - (l1 ? h[l1 - 1] : 0);
    unsigned long long h2 = h[r2] - (l2 ? h[l2 - 1] : 0);
    if (l1 < l2)
        h1 *= p[l2 - l1];
    if (l2 < l1)
        h2 *= p[l1 - l2];
    return h1 == h2;
}


== Ссылки ==
== Ссылки ==
Теория:
* [http://e-maxx.ru/algo/string_hashes e-maxx.ru &mdash; Алгоритмы хэширования в задачах на строки]
* [http://e-maxx.ru/algo/string_hashes e-maxx.ru &mdash; Алгоритмы хэширования в задачах на строки]
* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8_%D0%B2_%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B5_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F._%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A0%D0%B0%D0%B1%D0%B8%D0%BD%D0%B0-%D0%9A%D0%B0%D1%80%D0%BF%D0%B0 neerc.ifmo.ru &mdash; Поиск подстроки в строке с использованием хеширования. Алгоритм Рабина-Карпа]
* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8_%D0%B2_%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B5_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F._%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A0%D0%B0%D0%B1%D0%B8%D0%BD%D0%B0-%D0%9A%D0%B0%D1%80%D0%BF%D0%B0 neerc.ifmo.ru &mdash; Поиск подстроки в строке с использованием хеширования. Алгоритм Рабина-Карпа]
* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BD%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%D0%B9_%D0%BE%D0%B1%D1%89%D0%B5%D0%B9_%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8_%D0%B4%D0%B2%D1%83%D1%85_%D1%81%D1%82%D1%80%D0%BE%D0%BA_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F neerc.ifmo.ru &mdash; Поиск наибольшей общей подстроки двух строк с использованием хеширования]
* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BD%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%D0%B9_%D0%BE%D0%B1%D1%89%D0%B5%D0%B9_%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8_%D0%B4%D0%B2%D1%83%D1%85_%D1%81%D1%82%D1%80%D0%BE%D0%BA_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F neerc.ifmo.ru &mdash; Поиск наибольшей общей подстроки двух строк с использованием хеширования]
* [http://habrahabr.ru/post/142589/ habrahabr.ru &mdash; Полиномиальные хеши и их применение]
* [http://codeforces.com/blog/entry/4898 codeforces.com &mdash; Anti-hash test]
Код:
* [http://github.com/indy256/codelibrary/blob/master/java/src/Hashing.java CodeLibrary &mdash; Hashing on strings]
* [http://github.com/indy256/codelibrary/blob/master/java/src/Hashing.java CodeLibrary &mdash; Hashing on strings]
* [http://github.com/ADJA/algos/blob/master/Strings/Hashing.cpp Algos &mdash; Hashing in strings based problems]
Задачи:
* [[:Категория: Задачи: Хеширование строк|Задачи: Хеширование строк]]


[[Категория:Строки]]
[[Категория:Строки]]

Версия от 09:45, 10 августа 2015

unsigned long long X = 31, p[100010], h[100010];

void buildHash(char *s) {
    p[0] = 1;
    h[0] = s[0] - 'a';
    for (int i = 1; s[i]; i++) {
        p[i] = p[i - 1] * X;
        h[i] = h[i - 1] + p[i] * (s[i] - 'a');
    }
}

bool areEqual(int l1, int r1, int l2, int r2) {
    unsigned long long h1 = h[r1] - (l1 ? h[l1 - 1] : 0);
    unsigned long long h2 = h[r2] - (l2 ? h[l2 - 1] : 0);
    if (l1 < l2)
        h1 *= p[l2 - l1];
    if (l2 < l1)
        h2 *= p[l1 - l2];
    return h1 == h2;
}

Ссылки

Теория:

Код:

Задачи: