#include <bits/stdc++.h>
using namespace std;
#define LEN 1000000
int power[LEN];
int base = 10;
void init()
{
power[0] = 1;
for (int i = 1; i < LEN; i++)
{
power[i] = power[i - 1] * base;
}
}
void prefixHash(string str, vector<int> &ph)
{
int n = str.size();
int sum = 0;
for (int i = 0; i < n; i++)
{
sum *= base;
sum += (str[i] - '0');
ph[i] = sum;
}
cout << sum << "\n";
for (int num : ph)
{
cout << num << " ";
}
}
int calcHash(int l, int r, vector<int> &ph)
{
if (l == 0)
return ph[r];
return ph[r] - ph[l - 1] * power[r - l + 1];
}
int main()
{
string str = "101245";
int n = str.size();
vector<int> ph(n);
int l = 2 , r = 3;
init();
prefixHash(str, ph);
cout << "\n";
cout << "Calculated Hash: " << calcHash(l, r, ph) << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgTEVOIDEwMDAwMDAKaW50IHBvd2VyW0xFTl07CmludCBiYXNlID0gMTA7Cgp2b2lkIGluaXQoKQp7CiAgICBwb3dlclswXSA9IDE7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IExFTjsgaSsrKQogICAgewogICAgICAgIHBvd2VyW2ldID0gcG93ZXJbaSAtIDFdICogYmFzZTsKICAgIH0KfQoKdm9pZCBwcmVmaXhIYXNoKHN0cmluZyBzdHIsIHZlY3RvcjxpbnQ+ICZwaCkKewogICAgaW50IG4gPSBzdHIuc2l6ZSgpOwogICAgaW50IHN1bSA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgIHsKICAgICAgICBzdW0gKj0gYmFzZTsKICAgICAgICBzdW0gKz0gKHN0cltpXSAtICcwJyk7CiAgICAgICAgcGhbaV0gPSBzdW07CiAgICB9CiAgICBjb3V0IDw8IHN1bSA8PCAiXG4iOwogICAgZm9yIChpbnQgbnVtIDogcGgpCiAgICB7CiAgICAgICAgY291dCA8PCBudW0gPDwgIiAiOwogICAgfQp9CgppbnQgY2FsY0hhc2goaW50IGwsIGludCByLCB2ZWN0b3I8aW50PiAmcGgpCnsKICAgIGlmIChsID09IDApCiAgICAgICAgcmV0dXJuIHBoW3JdOwogICAgcmV0dXJuIHBoW3JdIC0gcGhbbCAtIDFdICogcG93ZXJbciAtIGwgKyAxXTsKfQoKaW50IG1haW4oKQp7CiAgICBzdHJpbmcgc3RyID0gIjEwMTI0NSI7CgogICAgaW50IG4gPSBzdHIuc2l6ZSgpOwoKICAgIHZlY3RvcjxpbnQ+IHBoKG4pOwoKICAgIGludCBsID0gMiAgLCByID0gMzsKCiAgICBpbml0KCk7CiAgICBwcmVmaXhIYXNoKHN0ciwgcGgpOwogICAgY291dCA8PCAiXG4iOwogICAgY291dCA8PCAiQ2FsY3VsYXRlZCBIYXNoOiAiIDw8IGNhbGNIYXNoKGwsIHIsIHBoKSA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9Cg==