一维字符串Hash

unsigned long long f[N],p[N];//字符串前缀哈希值;p进制,一般取131,13331; 
unsigned long long get_hash(int l,int r) {
    return f[r]-f[l-1]*p[r-l+1];
}
p[0]=1;
int n=strlen(s+1);
for(int i=1; i<=n; i++) {
    f[i]=f[i-1]*131+(s[i]-'0');
    p[i]=p[i-1]*131;
}

二维

方法一:行和列分别哈希,但p进制不能一致比如行哈希用131,列哈希用13331

方法二:对字符块里面的每个字符从右到左,从下到上,按顺序排序,可以展开得到一维字符串

假设字符块横竖长度分别为:B、A

取每个块的哈希值时,是p[A*B],而不是类似这种p[r-l+1]

查询字符块是否存在时,可用multiset<unsigned long long> se,用se.count来查询是否存在。

posted on 2022-03-12 11:04  我疯故我在  阅读(55)  评论(0)    收藏  举报