給定兩個字串 \(a\) 和 \(b\),求 \(b\) 在 \(a\) 中的出現次數。
這是一道 \(kmp\) 的模板題。
不過 \(hash\) 是個好東西,可以用 \(hash\) 代替 \(kmp\) 演算法。
預處理兩個字串的雜湊值,然後將 \(a\) 中所有長度為 \(len(b)\) 的子串的雜湊值與 \(b\) 的雜湊值比較即可。
時間複雜度 \(o(n + m)\),與 \(kmp\) 演算法一樣!
缺點就是常數略大,而且不能用 \(kmp\) 的 \(next\) 陣列。
#include using namespace std;
typedef unsigned long long ull;
const int maxn = 1e6 + 10;
const int base = 131;
ull h1[maxn], h2;
ull p[maxn];
int main()
for(int i = 0; i < s2.size(); ++i)
int ans = 0;
for(int i = s2.size(); i <= s1.size(); ++i)
}cout << ans << endl;
return 0;
}
loj 103子串查詢——用hash代替kmp演算法 103 子串查詢
記憶體限制 256 mib時間限制 500 ms標準輸入輸出 題目型別 傳統評測方式 文字比較 上傳者 匿名 提交提交記錄 統計討論 測試資料 題目描述 這是一道模板題。給定乙個字串 a aa 和乙個字串 b bb,求 b bb 在 a aa 中的出現次數。a aa 中不同位置出現的 b bb 可重...
8 21 問題 F 103 子串查詢
題目描述 這是一道模板題。給定乙個字串 a和乙個字串 b,求 b 在 a 中的出現次數。a中不同位置出現的 b 可重疊。輸入 輸入共兩行,分別是字串 a 和字串 b。輸出 輸出乙個整數,表示 b 在 a 中的出現次數。樣例輸入 zyzyzyz zyz樣例輸出3 提示 1 a,b 的長度 106 a ...
hash 詢問等價子串
給出乙個長度為 n 的字串,有 m 個詢問,每次詢問這個字串中的兩個子串是否等價。資料範圍 n,m leq200000 從是否存在一種字元的對應關係入手。對於每個串,把每個字母是否在這一位上記為 0 或 1 形成乙個 01 串,26 個字母共有 26 個字串。對於兩串的某兩個字母,如果它們的 01 ...