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

posted @ 2020-02-03 23:17  Sweetness  阅读(105)  评论(0编辑  收藏  举报