基礎演算法 841.字串雜湊
阿新 • • 發佈:2022-05-07
也叫字串字首雜湊法。
例如字串“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; }