【哈希】兔子與兔子
阿新 • • 發佈:2018-08-23
pac return 小寫 amp color 外星生物 namespace 森林 efi
接下來一個數字 m,表示 m 次詢問。
接下來 m 行,每行四個數字 l1, r1, l2, r2,分別表示此次詢問的兩個區間,註意字符串的位置從1開始編號。
其中 1 ≤ length(S), m ≤ 1000000
題目描述
很久很久以前,森林裏住著一群兔子。有一天,兔子們想要研究自己的 DNA 序列。我們首先選取一個好長好長的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 個小寫英文字母),然後我們每次選擇兩個區間,詢問如果用兩個區間裏的 DNA 序列分別生產出來兩只兔子,這兩個兔子是否一模一樣。註意兩個兔子一模一樣只可能是他們的 DNA 序列一模一樣。
輸入
第一行一個 DNA 字符串 S。接下來一個數字 m,表示 m 次詢問。
接下來 m 行,每行四個數字 l1, r1, l2, r2,分別表示此次詢問的兩個區間,註意字符串的位置從1開始編號。
其中 1 ≤ length(S), m ≤ 1000000
輸出
對於每次詢問,輸出一行表示結果。如果兩只兔子完全相同輸出 Yes,否則輸出 No(註意大小寫)
樣例輸入
aabbaabb
3
1 3 5 7
1 3 6 8
1 2 1 2
樣例輸出
Yes
No
Yes
#include <bits/stdc++.h> #define ll long long #define ull unsigned long long #define ld long double using namespace std; const int maxn=1e6+1; ll hashh[maxn],p[maxn]; char s[maxn];int l1,l2,r1,r2; int n,len,q; int main() { scanf("%s",s+1); len=strlen(s+1); scanf("%d",&q); p[0]=1; for(int i=1;i<=len;i++) { hashh[i]=hashh[i-1]*103+(s[i]-‘a‘+1); p[i]=p[i-1]*103; } for(int i=0;i<q;i++) { scanf("%d %d %d %d",&l1,&r1,&l2,&r2);if(hashh[r1]-hashh[l1-1]*p[r1-l1+1]==hashh[r2]-hashh[l2-1]*p[r2-l2+1]) printf("Yes\n"); else printf("No\n"); } return 0; }
【哈希】兔子與兔子