給出乙個長度為\(n\)的字串,有\(m\)個詢問,每次詢問這個字串中的兩個子串是否等價。
資料範圍:\(n,m\leq200000\)
從是否存在一種字元的對應關係入手。
對於每個串,把每個字母是否在這一位上記為\(0\)或\(1\),形成乙個\(01\)串,\(26\)個字母共有\(26\)個字串。
對於兩串的某兩個字母,如果它們的\(01\)串相同,那麼它們就可以互相對應。
因為乙個位置上不可能同時有\(2\)個字母,所以同乙個子串的每個字母的\(01\)串都不同,我們就可以用排序來一一判斷是否相同。
\(01\)串就用字串\(hash\)來快速取出。
#include #include int n, m;
unsigned long long f[27][200001], p[200001], f1[27], f2[27];
char c[200001];
int main()
if (!flag) printf("yes\n");
}}
LOJ 103 子串查詢 Hash
給定兩個字串 a 和 b 求 b 在 a 中的出現次數。這是一道 kmp 的模板題。不過 hash 是個好東西,可以用 hash 代替 kmp 演算法。預處理兩個字串的雜湊值,然後將 a 中所有長度為 len b 的子串的雜湊值與 b 的雜湊值比較即可。時間複雜度 o n m 與 kmp 演算法一樣...
等價串 解題報告
牛客小白月賽4 f等價串 解題報告 題目描述 一串長度為 n 的字串 a 和一串長度為 m 的字串 b。並且這兩串字串只會含有 0 或 1 鐵子可以對字串 a 執行兩種操作,兩種操作可以執行任意次。操作1 無情替換 鐵子可以用 11 替換掉 0 也可以用 00 替換掉 1 操作2 極限刪除 鐵子可以...
LeetCode 特殊等價字串
你將得到乙個字串陣列 a。如果經過任意次數的移動,s t,那麼兩個字串 s 和 t 是特殊等價的。一次移動包括選擇兩個索引 i 和 j,且 i 2 j 2,交換 s j 和 s i 現在規定,a 中的特殊等價字串組是 a 的非空子集 s,這樣不在 s 中的任何字串與 s 中的任何字串都不是特殊等價的...