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];
}
字符串哈希(Hash模板)
最新推荐文章于 2024-09-05 20:33:20 发布