HASH相关
2016-02-04 11:08
323 查看
HASH这个东西的两个经典应用分别是用在字符串上和用在图(树)上
我们直接来看代码
求一个串的hash值的时间复杂度为O(length(a))O(length(a))
给定一个串A,如果想求它的任意一个子串的HASH我们可以做到O(length(a))−O(1)O(length(a))-O(1)的复杂度
求法就是求HASH的逆展开,把两段字符串的HASH值合并也都类似
hash[a]=(((seed1 xor hash[son1])modp)∗seed1 xor hash[son2])modp)⋯hash[a]=(((seed1~\text{ xor }~hash[son_1])\bmod {p})*seed1~\text{ xor }~hash[son_2])\bmod{p})\cdots
得到有根树的hashhash值
[BZOJ4337] BJOI2015 树的同构
CODE
HASH在字符串上
OI中性价比最高的HASH函数为BKDRHash函数我们直接来看代码
const seed=131; //31/131/1313/13131/131313 mmod=$FFFFFFFF; function bkdrhash(str:string):int64; var i:longint; begin bkdrhash:=0; for i:=1 to length(str) do bkdrhash:=(bkdrhash*seed+ord(str[i]))mod mmod; end;
求一个串的hash值的时间复杂度为O(length(a))O(length(a))
给定一个串A,如果想求它的任意一个子串的HASH我们可以做到O(length(a))−O(1)O(length(a))-O(1)的复杂度
求法就是求HASH的逆展开,把两段字符串的HASH值合并也都类似
const seed=131; //31/131/1313/13131/131313 mmod=$FFFFFFFF; var pow,x:array[0..10000]of int64; i,j,k:longint; l,r:longint; a:string; function hash(l,r:longint):int64; begin exit((x[r]-x[l-1]*pow[r-l+1]mod mmod+mmod)mod mmod); end; begin pow[0]:=1; for i:=1 to 100 do pow[i]:=(pow[i-1]*seed)mod mmod; readln(a); x[0]:=0; for i:=1 to length(a) do x[i]:=(x[i-1]*seed+ord(a[i]))mod mmod; readln(l,r); writeln(hash(l,r)); end.
HSAH在树上
有根树
将一个点的儿子节点的hashhash值从小到大排序后hash[a]=(((seed1 xor hash[son1])modp)∗seed1 xor hash[son2])modp)⋯hash[a]=(((seed1~\text{ xor }~hash[son_1])\bmod {p})*seed1~\text{ xor }~hash[son_2])\bmod{p})\cdots
得到有根树的hashhash值
无根树
拎出每一个点作为根,判断两棵树所有hashhash值相同即为同构树[BZOJ4337] BJOI2015 树的同构
CODE
相关文章推荐
- WCF创建学习二:使用XML配置终结点发布服务端
- MySQL创建用户与授权
- ubuntu下如何查看用户登录及系统授权相关信息【转】
- [LeetCode][JavaScript]Power of Three
- DDOs攻击-Java实现
- JPA学习笔记-Spring整合JPA
- JPA学习笔记-JPQL
- JPA学习笔记-二级缓存
- JPA学习笔记-映射双向多对多的关联关系
- mysql数据库一主多从的搭建
- JPA学习笔记-映射双向一对一的关联关系
- JPA学习笔记-映射双向一对多的关联关系
- JPA学习笔记-映射单向一对多的关联关系
- JPA学习笔记-映射单向多对一的关联关系
- JPA学习笔记-EntityManager
- JPA学习笔记-Hello world
- Spring Data学习笔记-查询方法
- Spring Data学习笔记-Hello world
- symbol lookup error: undefined symbol
- ArcGIS教程:大型数据集的分块处理