自主学习笔记类产物。
——————————————————————————————————————————
MAP与哈希表(初学)
底层实现
map:红黑树
unorderd map:哈希表
哈希也称散列函数,它是一个不可逆的单项映射。
键值对:每一个键值key对应了一个取值value
哈希函数是一个带有模数的函数 f(x)=xf(x)=xf(x)=x modmodmod MMM
MMM很重要,它必须是质数。(不然发生哈希冲突的概率会很大)
MMM越大,越不容易发生哈希冲突
可以使用两个哈希来避免哈希冲突。
公共溢出区:unsigned long long
string 哈希:进制不要太大,模数一定要大
可以使用unsigned long long
哈希能够表示任意一个子串的哈希值,所以它的应用范围相当广。
它还能维护变换的字符串。(带修改)
树哈希
判断两棵树是否是同构。
——————————————————————————————————————————
MAP(再学)
哈希的核心思想:把一个大块数据(字符串、数组)映射成一个数字,这个数字可以比较方便地用来比较,查找,去重。
字符串哈希:把字符串看作是一个B进制数字,并取模一个大质数M
哈希的常用技巧:
1.预处理前缀哈希(可以O(1)得到任何子串的哈希数值)
2.双哈希:用两个模数计算得到不同的哈希值,配对使用
哈希板子:https://www.luogu.com.cn/problem/P4305
这道题比较玄。会卡输入输出,所以记得关闭同步流。
然后我们来看这个:https://www.luogu.com.cn/problem/P4503
给出N个字符串。相似的定义为:两个字符串只有一位不同。询问有多少对相似字符串。
核心思路是:枚举哪一位不同,然后挖掉这一位去比较剩下的部分。
我们预处理所有字符串前后缀,然后枚举j。最后计算挖掉j之后的结果。