字串匹配 Hash

2021-08-25 08:57:21 字數 1343 閱讀 9077

俗話說:

字串問題只有一種做法----hash;hash hash

給定兩個由小寫字母構成的字串 l 和 s 。

請你從左到右,找出子串 l 在母串 s 中每次出現的開始位置(匹配位置)。

第一行:給乙個全由小寫字母構成的母串 s(0<s的長度≤1000000);

第二行:給乙個全由小寫字母構成的子串 l(0<l的長度≤s的長度)。

按公升序輸出一行乙個整數,分別表示子串 l 在母串 s 中每次出現的開始位置。

如果子串 l 在母串 s 中沒有出現,則輸出「no」。

輸入  [複製]

yuabcierabcde 

abc

輸出

9

輸入  [複製]

abcdefg 

abcdefu

輸出

no
【樣例1說明】

從第3個位置起,第一次匹配;

從第9個位置起,第二次匹配。

用hash寫kmp模板......

字串匹配主要是求hash字首

舉個例子

'abcde'

hash[1]=a  hash[2]=hash[1]*31+b  hash[3]=hash[2]*31+c...

那我們要去'cd'的hash值

就可以hash[4]-hash[2]*31*31

於是我用map+unsigned long long 來存

unsigned long long 可以不用取模, 大於2^64自動%2^64 而且非常快

typedef unsigned long long ull;

maphash;

//求a的hash字首

for(int i=1;i<=s1;i++)

開始匹配

//s1,s2為長度,j為當前匹配的末尾,i是開頭

//與普通字首和一樣是hash[i-1]

//mul[s2]=31^s2

for(int i=1;i<=s1-s2+1;i++){

int j=i+s2-1;

ull x=hash[j]-hash[i-1]*mul[s2];

if(x==sum) cout《預處理mul

mul[1]=1;

for(int i=31;i<=s2;i++)

mul[i]=mul[i-1]*31;

時間複雜度 o(n)

滾動hash實現字串匹配

生成乙個長度為l陣列的雜湊碼,需要o l 時間。如何在常數時間生成滑動視窗陣列的雜湊碼?利用滑動視窗的特性,每次滑動都有乙個元素進,乙個出。由於只會出現小寫的英文本母,因此可以將字串轉化成值為 0 到 25 的整數陣列 arr i int s.charat i int a 按照這種規則,abcd整數...

Hash 字串 字串雜湊

luo gu luogu luogup 3370 p3370 p337 0如題,給定n個字串 第i個字串長度為mi,字串內包含數字 大小寫字母 請求出n個字串中共有多少個不同的字串。第一行包含乙個整數n,為字串的個數。接下來n行每行包含乙個字串,為所提供的字串。輸出包含一行,包含乙個整數,為不同的字...

白兔的字串 字串hash

原題 一道典型的字串hash,至於hash,這裡講的非常好。一開始用map函式一直超時,後來改用unordered map就過了,至於這2個map的區別,這裡講的挺清楚的。之後去查了一下其它方法,發現還有一種方法是手寫map函式 強 指明 大佬 unordered map是跑了600ms,重寫跑了1...