日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

『ACM-算法-Hash算法』信息竞赛进阶指南--字符串哈希

發(fā)布時間:2023/12/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 『ACM-算法-Hash算法』信息竞赛进阶指南--字符串哈希 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

字符串hash主要應用在:

尋找長度為n的主串S中的匹配串T(長度為m)出現(xiàn)的位置或次數(shù)的問題屬于字符串匹配問題。
類似的還有KMP,我也有講解。

原理:

  • 將字符串中的每一個字母都看做是一個數(shù)字(例:從a-z,視為1-26);

  • 選取兩個合適的互質常數(shù) b和h,其中h要盡可能的大一點,為了降低沖突的概率。

  • 定義哈希函數(shù),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

  • C代表一個字符串,用C=c1 c2 c3 c4…cm;表示該字符串,其中 ci 表示從前向后數(shù)的第 i 個字符;
  • 方括號[ ]內的表達式:c1b^(m-1) + c2b^(m-2) + . . . + c0*b^0 意為將字符串C當做 b進制數(shù) 來處理,b是基數(shù);
  • 關于對 h 取模,若b,h有公因子,那么不同的字符串取余之后的結果發(fā)生沖突的幾率將大大大增加( 沖突:不同的字符串但 會有相同的hash值)
  • 計算上一步H(C)H(C)H(C)的過程是遞歸實現(xiàn)的:H(C,k)為前 k 個字符構成的字符串的哈希值,(若不考慮取模):

  • H(C,k+1)= H( C , k ) * b+c( k+1 );
  • 判斷 主串上 長度為 n 的任意子串 C '=c(k+1) c(k+2) c(k+3) . . . c(k+n) 與 待匹配串S=s1 s2 s3. . .sn 的哈希值是否相等,則:
  • H(C ’)= H( C , k+n ) - H(C, k ) * b^n;

    實現(xiàn):

    //模板是李煜東的信息進階指南 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算法』信息竞赛进阶指南--字符串哈希的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。