白兔的字串

2021-10-06 07:58:34 字數 1395 閱讀 6949

時間限制: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 ...