题目连接
通过这个题目来初步认识哈希算法
#include <iostream>
#include <string>
using namespace std;
typedef unsigned long long ULL;
char s[100010];
//第i位放的是第1位到第i位的哈希值
ULL hashq[100010];
//dp里放权值
ULL dp[100010];
int n, m;
//要得到a位到b位的哈希值
//和十进制一样 就是 相减
ULL get_hash(int a, int b)
{
// 131 131*131 131*131*131 131*131*131*131
// 下面的就是 拿出字符串某些位的方法
//乘权是因为要对齐 那他们对齐之后再相减 原本的hash一定是大的
//减去的就像是十进制*10^多少次方 剩下的就是原本的
//说的有点乱
return hashq[b] - hashq[a - 1] * dp[b - a + 1];
}
int main()
{
cin >> n >> m;
cin >> (s + 1);
dp[0] = 1;
for (int i = 1; i <= n; ++i)
{
hashq[i] = hashq[i - 1] * 100 + s[i];
dp[i] = dp[i - 1] * 100;
}
while (m--)
{
int x_1, x_2, y_1, y_2;
cin >> x_1 >> y_1 >> x_2 >> y_2;
if (get_hash(x_1, y_1) == get_hash(x_2, y_2))
cout << "Yes";
else
cout << "No";
cout << endl;
}
return 0;
}