【CH - 1401】 兔子与兔子(字符串哈希)
題干:
描述
很久很久以前,森林里住著一群兔子。有一天,兔子們想要研究自己的 DNA 序列。我們首先選取一個(gè)好長(zhǎng)好長(zhǎng)的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 個(gè)小寫(xiě)英文字母),然后我們每次選擇兩個(gè)區(qū)間,詢(xún)問(wèn)如果用兩個(gè)區(qū)間里的 DNA 序列分別生產(chǎn)出來(lái)兩只兔子,這兩個(gè)兔子是否一模一樣。注意兩個(gè)兔子一模一樣只可能是他們的 DNA 序列一模一樣。
輸入格式
第一行一個(gè) DNA 字符串 S。
接下來(lái)一個(gè)數(shù)字 m,表示 m 次詢(xún)問(wèn)。
接下來(lái) m 行,每行四個(gè)數(shù)字 l1, r1, l2, r2,分別表示此次詢(xún)問(wèn)的兩個(gè)區(qū)間,注意字符串的位置從1開(kāi)始編號(hào)。
其中 1 ≤ length(S), m ≤ 1000000
輸出格式
對(duì)于每次詢(xún)問(wèn),輸出一行表示結(jié)果。如果兩只兔子完全相同輸出 Yes,否則輸出 No(注意大小寫(xiě))
樣例輸入
aabbaabb 3 1 3 5 7 1 3 6 8 1 2 1 2樣例輸出
Yes No Yes來(lái)源
羅翔宇,北京大學(xué)2014年數(shù)據(jù)結(jié)構(gòu)與算法A(實(shí)驗(yàn)班)期末考試
解題報(bào)告:
? 這題讓他自然溢出或者加個(gè)模數(shù)都可以,,畢竟數(shù)據(jù)水,,但是你的模數(shù)大于1e10就不行了、、(那就相當(dāng)于兩個(gè)模數(shù)了啊)
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 ;}總結(jié):
? ?剛開(kāi)始直接用mod=1e13,1e16,1e18各試了一次,,都wa了,,還以為是有Hash Crash了,,還弄了個(gè)Hash2數(shù)組用不同的種子p2去哈希了一次,兩次Hash判斷如果均相同才輸出Yes。。。但是發(fā)現(xiàn)不是這里的問(wèn)題,就是模數(shù)大打了。
? 其二,其實(shí)這題可以不用快速冪的,因?yàn)槟愣际怯玫膒,所以可以先預(yù)處理一下次冪。
總結(jié)
以上是生活随笔為你收集整理的【CH - 1401】 兔子与兔子(字符串哈希)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 对标坦克300 奇瑞捷途硬派越野车T-1
- 下一篇: 【POJ - 3310】Caterpil