一维字符串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来查询是否存在。

浙公网安备 33010602011771号