题意:判断两个子串是否相等
我们通过书可以知道:已知hash(s+t), hash(s), 那么就可以O(1)求出hash(t).
公式:hash(t) = hash(s+t)-hash(s)*p^t.length
所以处理完前缀hash值后,就可以通过上述方法来判断任意两个子串是否相等.
#include <bits/stdc++.h> using namespace std; typedef unsigned long long uLL; const int P = 13331; const int maxn = 1e6+5; uLL value[maxn]; uLL plen[maxn]; char s[maxn]; void pre(){ int len = strlen(s+1); for(int i = 1; i <= len; i++){ value[i] = value[i-1]*P + s[i]-'a'+1; } plen[0] = 1; for(int i = 1; i <= len; i++){ plen[i] = plen[i-1]*P; } } int main(){ scanf("%s", s+1); pre(); //预处理 int m; scanf("%d", &m); while(m--){ int a, b, c, d; scanf("%d %d %d %d", &a, &b, &c, &d); if(value[b]-value[a-1]*plen[b-a+1] == value[d]-value[c-1]*plen[d-c+1]){ //直接判断两个子串的hash值是否相等 printf("Yes\n"); } else printf("No\n"); } return 0; }