Module: 哈希


Problem

7 /8


文化接触

Theory Click to read/hide

除了序列之外,您还可以散列集。也就是说,没有顺序的对象集。根据以下公式计算:
hash(A) = \(\sum_{a \in A} p^{ord(a)}\)   <- 对所有事物进行模数计算
其中 ord 是一个函数,它将所有可能对象中的绝对序数分配给集合中的一个对象(例如,如果对象是自然数,则 ord(x) = x,如果是小写拉丁字母,则 ord(& #39;a' ;) = 1, ord('b') = 2 等)

也就是说,对于每个对象,我们将一个等于基数的值与该对象的数量次方相关联,并将所有这些值相加,以获得整个集合的哈希值。从公式中可以清楚地看出,如果将元素添加到集合或从集合中删除(只需添加或减去所需的值),则很容易重新计算哈希。同样的道理, 如果不是添加或删除单个元素,而是添加或删除其他集合(只需添加/减去它们的散列)。

正如您已经了解的那样,单个元素被视为大小为 1 的集合,我们可以为其计算哈希。更大的集合只是这些单个集合的并集,通过组合集合,我们添加它们的哈希值。

事实上,这仍然是相同的多项式哈希,但在 pm  处的系数之前,我们有值数 n - m - 1 下的序列元素(其中 n 是序列的长度),现在这是集合中绝对序数等于 m 的元素数。

在这种散列中,必须采用足够大的基数(大于最大集合大小),或者使用双重散列来避免出现绝对序数为 m 的一组 p 个对象与具有一个绝对序数的对象的集合具有相同散列的情况序数 m+1.
 

Problem

18世纪初,一群欧洲探险家到达了一个岛上,岛上居住着一群从未接触过欧洲文明代表的部落。

为了成功地与当地人建立联系,该团体的首领计划向他遇到的每个部落的首领赠送一份礼物。为此,他带来了一条长长的玻璃链,类似于宝石。 
让我们将字符串表示为字符串 s,由英文字母的小写字母组成,其中每个字母表示相应位置的玻璃片类型。 
研究人员准备将锁链切割成一些碎片,然后将恰好一个碎片交给小组遇到的每个部落的首领。研究负责人决定按照以下规则将链拆分成碎片:
  • 为了不在切割上花费大量时间,每个片段应该是链中一组相邻的玻璃片,即字符串s的一个子串。
  • 必须使用所有玻璃片,即每片玻璃必须恰好包含在一个碎片中。
  • 因为研究人员不知道原住民如何评价某些类型的玻璃,所以他们希望每个酋长都得到同一套玻璃,而不考虑顺序。换句话说,对于任何类型的玻璃,这种类型的玻璃在每个碎片中的数量必须相同。
  • 研究人员不知道岛上有多少部落,所以准备的碎片数量越多越好。

帮助管理员确定最多可以获得的碎片数量。

输入:
第一行包含字符串 s (1 <= |s| <= 5000000)。

输出:
打印一个数字——研究人员可以在不违反组长制定的任何条件的情况下将他们拥有的链切割成的最大可能片段数。

示例:
  <正文>
说明:
在第一个示例中,研究人员可以打破“abbabbab”链碎片“abb”、“abb”、“bab”,然后他们遇到的每个部落的首领将获得一杯“a”类型的玻璃杯。和两首“b”。

在第二个例子中,字符串不能被分成一个以上的链片段,观察所有条件。
输入 输出
abbabbab 3
aabb 1