時間限制:c/c++
1秒,其他語言2秒
空間限制:c/c++
262144k,其他語言524288k
64bit io format:
%lld
白兔有乙個字串t。白雲有若干個字串s1,s2…sn。輸入描述:白兔想知道,對於白雲的每乙個字串,它有多少個子串是和t迴圈同構的。
所有字元都是小寫英文本母
第一行乙個字串t(|t|<=10^6)
第二行乙個正整數n (n<=1000)
接下來n行為s1~sn (|s1|+|s2|+…+|sn|<=10 ^ 7),max(|s1|,|s2|,|s3|,|s4|,…|sn|)<=10 ^ 6
輸出描述:
輸出n行表示每個串的答案
示例1輸入
abab
2abababab
ababcbaba
輸出
5
2
hash題
好久沒打都忘得差不多了
講雜湊的部落格
根據題意,我們可以得知,要尋找與t是迴圈同構的子串
那t也就相當於是環,我們拆環為鏈,長度加倍,
然後將二倍的t中每一部分取雜湊,每一部分的長度就是原t的長度
然後根據大小進行排序
輸入子串a後,因為是在中取連續子串,所以本身就是一條鏈,我們按照t的長度對a的每一部分取hash然後比較是否相等
比較大小的方法可以用二分查詢,因為我們之前已經對大小進行排序了;也可以模擬map,直接用map會超時
因為我的**寫太亂了,找了大佬條理清晰的**。
並加上詳細注釋(應該很詳細了 )
#include
using
namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
int maxn =
1e6+5;
ull hs[maxn]
;ull base[maxn]
;char t[maxn<<1]
,s[maxn]
;int n;
vector v;
ull gethash
(int i,
int j)
//查詢
bool
judge
(int i,
int j)
intmain()
return0;
}
白兔的字串 字串hash
原題 一道典型的字串hash,至於hash,這裡講的非常好。一開始用map函式一直超時,後來改用unordered map就過了,至於這2個map的區別,這裡講的挺清楚的。之後去查了一下其它方法,發現還有一種方法是手寫map函式 強 指明 大佬 unordered map是跑了600ms,重寫跑了1...
字串雜湊 牛客白兔的字串
時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 abab 2abababab ababcbaba 輸出 cpp 52 include using namespace std typedef unsign...
白兔的字串(字串hash 模擬map)
白兔有乙個字串t。白雲有若干個字串s1,s2.sn。白兔想知道,對於白雲的每乙個字串,它有多少個子串是和t迴圈同構的。所有字元都是小寫英文本母 第一行乙個字串t t 10 6 第二行乙個正整數n n 1000 接下來n行為s1 sn s1 s2 sn 10 7 max s1 s2 s3 s4 sn ...