1. 程式人生 > 其它 >基礎演算法 841.字串雜湊

基礎演算法 841.字串雜湊

也叫字串字首雜湊法。

例如字串“ABCDEFGH”。

用h[0], h[1], h[2]......h[n]分別表示前n個字元的子串的雜湊值。

將字串看作為p進位制的數字,再將其mod一個數,得到雜湊值。

經驗上來說,p一般為131,或1331。

mod的數為2^64。unsigned long long如果溢位,就相當於對它取模。

#include<iostream>

using namespace std;

typedef unsigned long long ULL;

const int N = 100010, p = 131;

ULL h[N], n[N];

ULL get(int l, int r){
    return h[r] - h[l - 1] * n[r - l + 1];
}

int main(){
    char str[N];
    int len, m;
    
    scanf("%d%d%s",&len, &m, str + 1);
    
    n[0] = 1;
    
    for(int i = 1; i <= len; i ++ ){
        n[i] = n[i - 1] * p;
        h[i] = h[i - 1] * p + str[i];
    }
    
    while(m -- ){
        int l1, r1, l2, r2;
        scanf("%d%d%d%d",&l1, &r1, &l2, &r2);
        
        if(get(l1, r1) == get(l2, r2)) puts("Yes");
        else puts("No");
    }
    
    return 0;
}