『ACM-算法-Hash算法』信息竞赛进阶指南--字符串哈希
生活随笔
收集整理的這篇文章主要介紹了
『ACM-算法-Hash算法』信息竞赛进阶指南--字符串哈希
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
字符串hash主要應用在:
尋找長度為n的主串S中的匹配串T(長度為m)出現的位置或次數的問題屬于字符串匹配問題。
類似的還有KMP,我也有講解。
原理:
將字符串中的每一個字母都看做是一個數字(例:從a-z,視為1-26);
選取兩個合適的互質常數 b和h,其中h要盡可能的大一點,為了降低沖突的概率。
定義哈希函數,H(C)=[c1?b(m?1)+c2?b(m?2)+...+cm?b0]modhH(C)=[ c_1*b^{(m-1)} + c_2*b^{(m-2)} + . . . + c_m*b^0 ] mod \ hH(C)=[c1??b(m?1)+c2??b(m?2)+...+cm??b0]mod?h
計算上一步H(C)H(C)H(C)的過程是遞歸實現的:H(C,k)為前 k 個字符構成的字符串的哈希值,(若不考慮取模):
實現:
//模板是李煜東的信息進階指南 char s[1000010]; unsigned long long f[1000010], p[1000010]; int n, q; int main() {scanf("%s", s + 1);n = strlen(s + 1);cin >> q;p[0] = 1; // 131^0for (int i = 1; i <= n; i++) {f[i] = f[i-1] * 131 + (s[i]-'a'+1); // hash of 1~ip[i] = p[i-1] * 131; // 131^i}for (int i = 1; i <= q; i++) {int l1, r1, l2, r2;scanf("%d%d%d%d", &l1, &r1, &l2, &r2);if (f[r1] - f[l1-1] * p[r1-l1+1] == // hash of l1~r1f[r2] - f[l2-1] * p[r2-l2+1]) { // hash of l2~r2puts("Yes");} else {puts("No");}} }總結
以上是生活随笔為你收集整理的『ACM-算法-Hash算法』信息竞赛进阶指南--字符串哈希的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果在中国禁售的型号有哪些
- 下一篇: 『ACM--算法--KMP』信息竞赛进阶