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 つのオブジェクトのセットと同じハッシュを持つ状況を避けるために、十分に大きなベース (セットの最大サイズより大きい) を取るか、二重ハッシュを使用する必要があります。序数 m+1。
 

Problem

18 世紀初頭、ヨーロッパの探検家の一団が、これまでヨーロッパ文明の代表者たちと接触したことのない部族のグループが住む島に到着しました。

原住民との接触をうまく確立するために、グループのリーダーは出会った各部族のリーダーに贈り物を贈ることを計画しています。この目的のために、彼は宝石に似た長いガラスの鎖を持ってきました。
この文字列を、英語のアルファベットの小さい文字で構成される文字列 s として表します。各文字は、対応する位置にあるガラスの種類を意味します。
研究者らは鎖をいくつかの断片に切断し、グループが遭遇した各部族の指導者にちょうど 1 つの断片を手渡す予定です。研究リーダーは、次のルールに従ってチェーンをフラグメントに分割することにしました。
  • 切断に多くの時間を費やさないために、各フラグメントはチェーン内の隣接するガラス片のグループ、つまり文字列 s の部分文字列である必要があります。
  • すべてのガラス片を使用する必要があります。つまり、各ガラス片が 1 つのフラグメントに含まれている必要があります。
  • 研究者らは、先住民が特定の種類のガラスをどのように評価するかわからないため、順序に関係なく各首長が同じガラスのセットを入手できるようにしたいと考えています。つまり、どのタイプのガラスでも、各フラグメント内でそのタイプのガラスの数が同じである必要があります。
  • 研究者は島に何部族が住んでいるのかを知らないため、準備される断片の数はできるだけ多くなる必要があります。

管理者が取得できるフラグメントの最大数を決定するのを手伝ってください。

入力:
最初の行には文字列 s (1 <= |s| <= 5000000) が含まれています。

出力:
単一の数字を出力します。これは、研究者がグループ リーダーによって策定された条件に違反することなく、鎖を切断できる断片の最大数です。

例:
  <本体>
説明:
最初の例では、研究者は「アッババブ」という連鎖を断ち切ることができます。断片「abb」、「abb」、「bab」の場合、出会った各部族のリーダーはタイプ「a」のグラスを 1 杯獲得します。そして「b」が 2 つあります。

2 番目の例では、すべての条件を観察すると、文字列をチェーンの複数のフラグメントに分割することはできません。
入力 出力
アッバババブ 3
aabb 1