Module: Hashing


Problem

7 /8


contatto culturale

Theory Click to read/hide

Oltre alle sequenze, puoi anche hash set. Cioè, insiemi di oggetti senza ordine su di essi. Viene calcolato secondo la seguente formula:
hash(A) = \(\sum_{a \in A} p^{ord(a)}\)   <- contare tutto modulo
dove ord è una funzione che assegna ad un oggetto dell'insieme il suo numero ordinale assoluto tra tutti i possibili oggetti (per esempio, se gli oggetti sono numeri naturali, allora ord(x) = x, e se lettere latine minuscole, allora ord(& #39;a' ;) = 1, ord('b') = 2 ecc.)

Cioè, per ogni oggetto associamo un valore pari alla base alla potenza del numero di questo oggetto e sommiamo tutti questi valori per ottenere un hash dell'intero insieme. Come risulta chiaro dalla formula, l'hash viene facilmente ricalcolato se un elemento viene aggiunto o rimosso dall'insieme (basta aggiungere o sottrarre il valore richiesto). Stessa logica,  se non vengono aggiunti o rimossi singoli elementi, ma altri insiemi (basta aggiungere/sottrarre il loro hash).

Come puoi già capire, i singoli elementi sono considerati come insiemi di dimensione 1, per i quali possiamo calcolare l'hash. E i set più grandi sono semplicemente un'unione di tali set singoli, dove combinando i set, aggiungiamo i loro hash.

In effetti, questo è sempre lo stesso hash polinomiale, ma prima del coefficiente in pm , avevamo il valore dell'elemento della sequenza sotto il numero n - m - 1 (dove n è la lunghezza della sequenza), e ora questo è il numero di elementi nell'insieme il cui numero ordinale assoluto è uguale a m.

In tale hashing, si deve prendere una base sufficientemente grande (maggiore della dimensione massima dell'insieme), o usare il doppio hashing per evitare situazioni in cui un insieme di p oggetti con numero ordinale assoluto m ha lo stesso hash di un insieme con un oggetto con numero ordinale assoluto m. numero ordinale m+1.
 

Problem

All'inizio del XVIII secolo, un gruppo di esploratori europei arrivò su un'isola abitata da un gruppo di tribù che non erano mai entrate in contatto con rappresentanti della civiltà europea.

Per stabilire con successo i contatti con gli indigeni, il capo del gruppo prevede di fare un regalo al capo di ogni tribù che incontra. A tal fine, portò una lunga catena di vetro, simile a pietre preziose. 
Rappresentiamo la stringa come una stringa s, composta da lettere minuscole dell'alfabeto inglese, dove ogni lettera indica il tipo di pezzo di vetro nella posizione corrispondente. 
I ricercatori taglieranno la catena in alcuni frammenti, quindi consegneranno esattamente un frammento al capo di ogni tribù incontrata dal gruppo. Il responsabile della ricerca ha deciso di dividere la catena in frammenti secondo le seguenti regole:
  • Per non perdere molto tempo a tagliare, ogni frammento dovrebbe essere un gruppo di pezzi di vetro adiacenti nella catena, cioè una sottostringa della stringa s.
  • Tutti i pezzi di vetro devono essere utilizzati, cioè ogni pezzo di vetro deve essere incluso esattamente in un frammento.
  • Poiché i ricercatori non sanno come gli aborigeni valuteranno certi tipi di vetro, vogliono che ogni capo ottenga lo stesso set di bicchieri indipendentemente dall'ordine. In altre parole, per qualsiasi tipo di vetro, il numero di vetri di questo tipo deve essere lo stesso in ciascuno dei frammenti.
  • I ricercatori non sanno quante tribù vivono sull'isola, quindi il numero di frammenti preparati dovrebbe essere il più grande possibile.

Aiuta il manager a determinare il numero massimo di frammenti che possono essere ottenuti.

Inserimento:
La prima riga contiene la stringa s (1 <= |s| <= 5000000).

Uscita:
Stampa un singolo numero: il numero massimo possibile di frammenti in cui i ricercatori possono tagliare la catena che hanno senza violare nessuna delle condizioni formulate dal capogruppo.

Esempi:
 
Input Uscita
abbabbbab 3
aab 1

Spiegazioni:
Nel primo esempio, i ricercatori possono spezzare la catena 'abbabbbab' frammenti 'abb', 'abb', 'bab', quindi il capo di ogni tribù che incontra riceverà un bicchiere di tipo 'a' e due pezzi di 'b'.

Nel secondo esempio, la stringa non può essere suddivisa in più di un frammento della catena, osservando tutte le condizioni.