Полиномиальные хеши одинаковых подстрок вышли разными. Не могу понять почему C++

Мне дается строка и индексы подстрок. Хочу определить равны ли эти подстроки с помощью полиномиальных хешей.

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main()
{
    string s;
    cin >> s;
    int a, b, c, d; //индексы подстрок s[a ... b] и s[c ... d]
    cin >> a >> b >> c >> d;
    if (b - a != d - c)
    {
        cout << "No" << endl;
        return 0;
    }
    size_t n = s.size();
    const int p = 31;
    vector<int> P(n, 1);
    for (size_t i = 1; i < n; i++)
    {
        P[i] = p * P[i - 1];
    }

    vector<int> h(n);
    for (size_t i = 0; i < n; i++)
    {
        h[i] = (s[i] - 'a' + 1) * P[i];
        if (i > 0)
            h[i] += h[i - 1];
    }

    long long h1 = h[b];
    if (a > 0)
    {
        h1 -= h[a - 1];
    }
    long long h2 = h[d];
    if (c > 0)
    {
        h2 -= h[c - 1];
    }

    if (h1 * P[d] == h2 * P[b] && s.substr(a, b - a + 1) == s.substr(c, d - c + 1))
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
}

И к сожалению равенство для хешей выполняется не для всех равных подстрок. Пример:

alalalala 1 3 5 7

Вывод: No. Не могу понять в чем проблема уже бьюсь долго...


Ответы (0 шт):