题意
Mirko要解一段加密文,但他只知道某一个句子是原文的一部分。你的任务是要在密文中找到第一个对应这个句子的地方。
文段是通过用某个单词(可能和原文一样的单词)替换原始文段每一个单词来加密的。如果某些单词在原文出现一次以上,就会使用相同的替换单词来替换。没有两个不同的单词使用相同的替换单词。
单词是通过空格隔开的小写字母序列。句子是连续单词的序列。
文段、句子长度不超过
106
Time
Limits:2000ms
Memory
Limits:64M
分析
我们发现,如果一段密文是由原文加密而来的,那该段密文中每两个相同单词间的间距要与原文中每两个相同单词间的间距相同。我们可用
f[i]
表示原文句子的第
i
个单词与它后面距离为
问题到这里就比较显然了,我们可以用哈希求出原文新字符串对应的哈希值,然后动态维护一段长度与原文长度相同的密文字符串的哈希值。即从左往右扫原文,每将我们将当前枚举的那段密文串向右移一位,就减去原来最左边的密文串的
f[l−1]
对哈希值的影响,再加上当前新结尾的
f[r]
对哈希值的影响。然后再将当前哈希值与目标哈希值比较。
但这样我们又会发现一个问题,就是如果密文串中的一个
f[i]+i
指向的位置超过了当前枚举的密文串的结尾,那么这个
f[i]
应暂时为
0
,当结尾扫到