汉明距离问题
汉明距离问题
给定两个等长的字符串,它们的汉明距离是指两个字符串对应位置不同字符的数目。
题目1:给定n个01字符串,每个字符串长度为k,要求找出汉明距离最大和最小的两对字符串。其中1≤n,k≤3×103。
我们可以发现如果用bitset来表示两个字符串,那么a and b实际上就表示各个位置是否相同,而a xor b则表示各个位置是否不同。于是乎我们可以O(n2k64)解决这个问题,常数很小。
提供一道题目。
题目2:给定n个字符串,每个字符串长度为k,字符集大小为104。要求找出汉明距离最大的两对字符串。其中1≤n≤106,1≤k≤6。
这里我们可以用随机化的做法。每次随机将字符集中的字符等概率替换为0或1。可以发现在新的n个01字符串中找到的最大汉明距离,一定不超过我们的答案。并且实际上至少有2−k的概率等于我们的答案。
因此从平均的角度来说,我们只需要随机大约2k次,之后解决一个01字符串找最大汉明距离的问题,后者可以O(n)解决。总的时间复杂度为O(2kn)。
题目3:给定字符串S和T,询问S有多少子串(与T等长)与T的汉明距离小于k。其中1≤|S|,|T|≤106,0≤k≤4。
提供一道问题。
对于一个给定的子串,我们可以通过二分+哈希很容易找到前k个不匹配的坐标。时间复杂度为O(|T|+k|S|log2|T|)。
题目4:给定两个字符串a和b,要求将a循环拼接n次得到a′,b循环拼接m次得到b′。保证|a′|=|b′|,计算a′与b′的汉明距离。其中1≤|a|,|b|≤106,且1≤n,m≤1012。其字符串中的元素e范围满足1≤e≤106。
提供一道题目。
当|a′|>lcm(|a|,|b|)的时候,我们可以先计算a′与b′的长度为lcm(|a|,|b|)的前缀的汉明距离后,乘上|a′|/lcm(|a|,|b|)即可得到最终结果。接下来认为|a′|=lcm(|a|,|b|)。
考虑ai是否可能会与bj处于同一位置,这等价于存在一个k,满足
{k=i(mod‖a‖)k=j(mod‖b‖)根据扩展中国余数定理知道k存在等价于gcd(|a|,|b|)∣i−j。且k在模lcm(|a|,|b|)意义下唯一。
因此我们可以枚举0≤i<g。之后判断{ai+kg}与{bi+kg}中有多少对元素不同,将所有结果加和就是我们的最终答案。这个过程O(|a|+|b|g)完成。
总的时间复杂度为O(n+m+log2n+log2m)。