题目连接

通过这个题目来初步认识哈希算法


#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;
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐