字符串哈希(Hash模板)

来源:互联网 发布:手机管理网络的软件 编辑:程序博客网 时间:2024/06/11 23:22
struct Hash{int hash[50500];int head[50500];int next[50500];int mod=10007;char mp[50500][20];void init(){memset(hash,0,sizeof(hash));memset(head,-1,sizeof(head));memset(next,-1,sizeof(next));}int get_hash(char *s){int seed=131;int h=0;for(int i=0;s[i];i++){h=((h*seed)%mod+(s[i]-'a'))%mod;}return h;}void add_hash(int s){int h=get_hash(mp[s]);next[s]=head[h];head[h]=s;}bool vj(char *s){int h=get_hash(s);h=head[h];while(h!=-1){if(strcmp(s,mp[h])==0)return true;h=next[h];}return false;}}T;void init_hash(int L,char *s,unsigned int *h)复杂度 O(L);输入 : L 字符串长度       s 字符串       h 串s的散列值预处理在h中unsigned int string_hash(unsigned int *h,int l,int r)复杂度 O(1)输入 :h 散列值预处理结果      l,r 需要散列的子串的首尾下标输出: 子串s[l,r)的散列值inline void init_hash(int l,char *s,unsigned int *h){h[0]=0;for(int i=1;i<=l;++i)h[i]=h[i-1]*mod+s[i-1];base[0]=1;for(int i=1;i<=l;++i)base[i]=base[i-1]*mod;}inline unsigned int string_hash(unsigned int *h,int l,int r){return h[r]-h[l]*base[r-l];}