【CH - 1401】 兔子与兔子(字符串哈希)
題干:
描述
很久很久以前,森林里住著一群兔子。有一天,兔子們想要研究自己的 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來源
羅翔宇,北京大學2014年數據結構與算法A(實驗班)期末考試
解題報告:
? 這題讓他自然溢出或者加個模數都可以,,畢竟數據水,,但是你的模數大于1e10就不行了、、(那就相當于兩個模數了啊)
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define ull unsigned long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int MAX = 2e6 + 5; char s[MAX]; ull Hash[MAX]; ull p = 31,p2=131; ull mod = 1e9 + 7; ull qpow(ull a,ull k) {ull res = 1;while(k) {if(k&1) res =(a*res)%mod;k>>=1;a=(a*a)%mod;}return res%mod; } int main() {cin>>s+1;int len = strlen(s+1);for(int i = 1; i<=len; i++) {Hash[i] = (Hash[i-1]*p + s[i]-'a'+1)%mod;}int m,l1,l2,r1,r2;cin>>m;while(m--) {scanf("%d%d%d%d",&l1,&r1,&l2,&r2);ull tmp1 = (Hash[r1] + mod - (Hash[l1-1] * qpow(p,r1-l1+1))%mod)%mod;ull tmp2 = (Hash[r2] + mod - (Hash[l2-1] * qpow(p,r2-l2+1))%mod)%mod;if(tmp1 == tmp2) puts("Yes");else puts("No");}return 0 ;}總結:
? ?剛開始直接用mod=1e13,1e16,1e18各試了一次,,都wa了,,還以為是有Hash Crash了,,還弄了個Hash2數組用不同的種子p2去哈希了一次,兩次Hash判斷如果均相同才輸出Yes。。。但是發現不是這里的問題,就是模數大打了。
? 其二,其實這題可以不用快速冪的,因為你都是用的p,所以可以先預處理一下次冪。
總結
以上是生活随笔為你收集整理的【CH - 1401】 兔子与兔子(字符串哈希)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对标坦克300 奇瑞捷途硬派越野车T-1
- 下一篇: 小米有品上架79元新品:看似口红 其实是