Полиномиальные хеши одинаковых подстрок вышли разными. Не могу понять почему 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. Не могу понять в чем проблема уже бьюсь долго...