就像cantor映射一样,字符串hash采取一种更加随机化的映射,它的通项公式为$hash[i]=\sum _{j=0}^{i}s[j]*p^{i-j}$,如此将一个字符串随机映射到了一个数字上,
我们来看这个公式的意义,他把一个字符串映射到了一个p进制数字上,位数代表着字符串的长度,然后我们将这个p进制数转化为十进制数并对1e9+7取模来存储,通项公式不好求,但是我们可以通过递推公式来求
$hash[i]=hash[i-1]\cdot p+s[i]$
这个公式就比较友好了,另外对于任意区间,我们有这个公式
$hash[l~r] = hash[r] - hash[l - 1] \cdot pow(p, r - l + 1)$
1 | struct str_hash {//单hash |
http://codeforces.com/contest/727/problem/E
给你一个长度为n×k的环,环上每一个位置有一个字符。现在给你g个长度为k的字符串,问是否可以在g个字符串中选出n个构成这个环。
1 ≤ n ≤ 10^5, 1 ≤ k ≤ 10^5, n*k ≤ 10^6, n ≤ g ≤ 10^5, g*k ≤ 2*10^6
枚举起点,hash.
- 本文作者: fightinggg
- 本文链接: http://fightinggg.github.io/yilia/yilia/PGMJAU.html
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!