[qbzt寒假]hash

散列(Hash)

(hash)函数至少要具有如右性质:快准可拼接

思想都会,俺就是没实现过

思想:将一串字符串转化成一个数(k),一般用于判断字符串是否相等

一般:选择一个(p),选择一个(mod),对一串字符,将其表示为(p)进制数:字符常用(ASCII)

如:(ykyky) (hash)(y*p^4+k*p^3+y*p^2+k*p+y)

丁神的神仙模数:(10^9+123) (color{White} { 20000905})

拼接(hash):两个(hash)拼接,放在左侧的(hash)值乘上(p^{右侧位数})

求一个区间([l,r])(hash)(记(h_i)表示从开头到(i)的前缀(hash)):(h_r-(h_{l-1})*p^{r-l+1})

BZOJ 3555 [Ctsc2014]企鹅QQ

(PenguinQQ)是中国最大、最具影响力的(SNS(Social Networking Services))网站,以实名制为基础,为用户提供日志、群、即时通讯、相册、集市等丰富强大的互联网功能体验,满足用户对社交、资讯、娱乐、交易等多方面的需求。
(Q)(PenguinQQ)网站的管理员,他最近在进行一项有趣的研究——哪些账户是同一个人注册的。经过长时间的分析,小(Q)发现同一个人注册的账户名称总是很相似的,例如(Penguin1,Penguin2,Penguin3……)于是小(Q)决定先对这种相似的情形进行统计。
(Q)定义,若两个账户名称是相似的,当且仅当这两个字符串等长且恰好只有一位不同。例如“(Penguin1)”和“(Penguin2)”是相似的,但“(Penguin1)”和“(2Penguin)”不是相似的。而小(Q)想知道,在给定的 个账户名称中,有多少对是相似的。
为了简化你的工作,小(Q)给你的(N)个字符串长度均等于(L),且只包含大小写字母、数字、下划线以及‘@’共64种字符,而且不存在两个相同的账户名称。

(N ≤ 30000; L ≤ 200; S ≤ 64)

求前缀(hash),枚举不同位,利用求区间(hash)的方法求出后半部分,然后拼接(hash),最后比较

其他(hash)相关:

(BZOJ) (3942) ([Usaco2015) (Feb]Censoring)

(BZOJ) (3916) ([Baltic2014]friends)

原文地址:https://www.cnblogs.com/zhuier-xquan/p/12257996.html