1、本质
全称字符串前缀哈希法,把字符串变成一个p进制数字(哈希值),实现不同的字符串映射到不同的数字。

2、例题
给定一个长度为 n 的字符串,再给定 m 个询问,每个询问包含四个整数 l1,r1,l2,r2,请你判断 [l1,r1] 和 [l2,r2] 这两个区间所包含的字符串子串是否完全相同。
字符串中只包含大小写英文字母和数字。
3、代码
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
char str[N];
int P = 131; //令p取131 或 13331 在%99的情况下不会起冲突 记住就好
int p[N], h[N];
//把字符串映射为p进制的整数
int main()
{
int n, m;
cin >> n >> m;
cin >> str + 1;
p[0] = 1;
for (int i = 1; i <= n; i++)
{
h[i] = h[i - 1] * P + str[i]-'a'+1;//求前i个字符的哈希值
p[i] = P * p[i - 1];//p[i]=p^i;
}
while (m--)
{
int l1, r1, l2, r2;
cin>>l1>>r1>>l2>>r2;
if (h[r1] - h[l1 - 1] * p[r1 - l1 + 1] == h[r2] - h[l2 - 1] * p[r2 - l2 + 1])
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}