题目链接:https://ac.nowcoder.com/acm/contest/308/e
tokitsukaze获得了一个长度为n,由a-z小写字母组成的字符串。
我们定义两个字符串是相似的,当且仅当能通过多次以下操作,使得两个字符串相等。并且把需要操作的最小次数,称为两个字符串的相似度。
操作是这样的:选择一个字符串,把字符串的每个字母都替换为字母表上的下一个字母,同时,我们认为z的下一个字母为a,比如选择”acdz”,操作一次后变为”bdea”。
现在tokitsukaze从字符串中任取两个子串,她想知道它们是不是相似的,如果它们相似,请输出相似度,如果它们不相似,请输出-1。
字符串哈希,好久没见到了。
这题可以预处理出变换26次的所有串,我们希望快速查询子串,于是想到用字符串哈希。
对于字符串$s$,我们预处理$hash[i]$为$s[1]\to s[i]$这个字符串前缀的哈希值,可以这样求:
$$
hash[i]=hash[i-1]*M+s[i]
$$
于是我们希望知道$s[i]\to s[j]$的哈希值,就可以:
$$
hash[j]-hash[i-1]\times M^{j-i+1}
$$
不用管hash的具体值,任其自然溢出就好。
1 |
|
供复习使用:https://blog.csdn.net/richard_for_oi/article/details/79306985