哈希用于字符串匹配

下面的代码中用unsigned long long 运算的自然溢出来省掉取模的过程。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const unsigned long long ull;
const ull B=100000007;
bool contain(string a,string b){
    int al=a.length();int bl=b.length();
    if(al>bl)return false;
    ull t=1;
    for(int i=0;i<al;i++)t*=B;
    ull ah=0,bh=0;
    for(int i=0;i<al;i++)ah=ah*B+a[i];
    for(int i=0;i<al;i++)bh=bh*B+b[i];
    for(int i=0;i+al<=bl;i++){
        if(ah==bh)return true;
        if(i+al<bl)bh=bh*B+b[i+al]-b[i]*t;
    }
    return false;
}

 

posted @ 2019-02-16 19:40  erge1998  阅读(294)  评论(0编辑  收藏  举报