俗話說:
字串問題只有一種做法----hash;hash hash
給定兩個由小寫字母構成的字串 l 和 s 。輸出請你從左到右,找出子串 l 在母串 s 中每次出現的開始位置(匹配位置)。
第一行:給乙個全由小寫字母構成的母串 s(0<s的長度≤1000000);
第二行:給乙個全由小寫字母構成的子串 l(0<l的長度≤s的長度)。
按公升序輸出一行乙個整數,分別表示子串 l 在母串 s 中每次出現的開始位置。
如果子串 l 在母串 s 中沒有出現,則輸出「no」。
輸入 [複製]
yuabcierabcde
abc
3輸入 [複製]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...