1. 程式人生 > >【哈希】兔子與兔子

【哈希】兔子與兔子

pac return 小寫 amp color 外星生物 namespace 森林 efi

題目描述

很久很久以前,森林裏住著一群兔子。有一天,兔子們想要研究自己的 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; }

【哈希】兔子與兔子