[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\)