码题集 拙劣的哈希

        小码哥发现自己保存的字符串中有很多重复的,于是他想清理掉那些重复的串。为此,他设计了一个哈希函数h(s),对于输入的字符串 s,该函数返回s中所有字符的ASCII码的异或和,然后他会将所有哈希值相同的字符串视为重复的串,并只留下一个。小码哥并没有意识到这种做法有很大的问题,请你计算这些字符串中不同的字符串的数量与小码哥最后留下的字符串数量之差,从而向他证明他的哈希函数是不严谨的。

         

        这题我采用的思路也非常简单,主要是运用了python自带的集合这个数据结构的性质,python集合的一个重要性质就是不会保存重复的元素。首先把输入的所有字符串全部保存在一个列表里面,然后将该列表转换成集合。根据集合的性质,原列表里相同的元素最后只会保存一个到集合里面,所以转换后集合里有多少个元素,原来的列表里就有多少个不相同的字符串。下一步就是把原列表里面的每一个字符串,按照题目给的操作方式进行异或运算,再把异或运算的结果保存在另一个列表里,这样新得到的这个列表里就保存了每个字符串异或运算的结果。最后再把这个异或运算后得到的新列表转换成另一个集合,这第二个集合里元素的个数,就是根据题目使用哈希函数h(s)的方法,得到的不同字符串的个数。那么这两个集合的元素个数的差,就是要的结果。

#该函数返回str中所有字符的ASCⅡ码的异或和
def binary(str):
    result = 0
    for i in str:
        result = result^ord(i)
    return result

n = int(input()) #输入字符串的个数
str_list = [] #定义一个列表保存输入的字符串

for i in range(n): #循环n次,依次把输入的字符串保存在列表str_list中
    string = input()
    str_list.append(string)
    
str_binary = [] #定义一个列表保存每一个字符串的异或和
for str in str_list:
    str_binary.append(binary(str))

#利用集合不保存重复元素的性质,得到结果
print(len(set(str_list)) - len(set(str_binary)))

猜你喜欢

转载自blog.csdn.net/ZZR2631574030/article/details/126157557