您的位置:首页 > 编程语言 > C语言/C++

字符串HASH模板

2016-02-01 16:39 399 查看
转自http://blog.csdn.net/cnyali/article/details/47367391



[cpp] view
plain copy

/*  

    从b串中寻找和a串长度相同的子串,返回开始位置  

    不保证绝对正确,发生冲突概率为O(sqrt(n)),  

    n为哈希函数的最大值  

*/   

#include<stdio.h>  

#include<string.h>  

#include<stdlib.h>  

#define ull unsigned long long    

const ull B = 1e8+7;       

const int MAXN = 5010;    

char a[MAXN],b[MAXN];    

    

int find()/*返回匹配位置的开始处的下标,-1表示没有匹配*/    

{    

    int al=strlen(a),bl=strlen(b);    

    if(al>bl)return -1;    

    ull t=1,ah=0,bh=0;    

    for(int i=0;i<al;i++)    

    {    

        t*=B;    

        ah=ah*B+a[i];    

        bh=bh*B+b[i];    

    }    

    for(int i=0;i+al<=bl;i++)    

    {    

        if(ah == bh)return i;    

        if(i+al < bl)bh=bh*B+b[i+al]-b[i]*t;    

    }    

    return -1;    

}    

  

int main(){  

    freopen("strhash.in","r",stdin);  

    freopen("strhash.out","w",stdout);    

    gets(a);  

    gets(b);  

    printf("%d\n",find());  

    return 0;  

}   

[cpp] view
plain copy

/*===================================================*\  

    从b串中寻找和a串长度相同的子串,返回开始位置  

    不保证绝对正确,发生冲突概率为O(sqrt(n)),  

    n为哈希函数的最大值  

\*===================================================*/    

    

#define ull unsigned long long    

const ull B = 1e8+7;    /*according to the book*/    

const int MAXN = 1001;    

char a[MAXN],b[MAXN];    

    

int HashFind()/*返回匹配位置的开始处的下标,-1表示没有匹配*/    

{    

    int al=strlen(a),bl=strlen(b);    

    if(al>bl)return -1;    

    ull t=1,ah=0,bh=0;    

    for(int i=0;i<al;i++)    

    {    

        t*=B;    

        ah=ah*B+a[i];    

        bh=bh*B+b[i];    

    }    

    for(int i=0;i+al<=bl;i++)    

    {    

        if(ah == bh)return i;    

        if(i+al < bl)bh=bh*B+b[i+al]-b[i]*t;    

    }    

    return -1;    

}    

    

/*===================================================*\  

    滚动哈希--滚动通过ull的溢出实现,相当于mod 2^64  

  

\*===================================================*/    

    

#define ull unsigned long long    

const int MAXN = 1001;    

const ull B = 1e8+7;    /*according to the book*/    

char a[MAXN],b[MAXN];    

    

int OverLap()/*a的后缀和b的前缀相等的最大长度*/    

{    

    int al=strlen(a),bl=strlen(b),ans=0;    

    int minlen=min(al,bl);    

    ull t=1,ah=0,bh=0;    

    for(int i=1;i<minlen;i++)    

    {    

        ah=ah+a[al-i]*t;    

        bh=bh*B+b[i-1];    

        if(ah == bh)ans=i;    

        t*=B;    

    }    

    return ans;    

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hash C++