日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【CH - 1401】 兔子与兔子(字符串哈希)

發(fā)布時(shí)間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【CH - 1401】 兔子与兔子(字符串哈希) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題干:

描述

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。