Costo delle lettere#11610

Costo delle lettere (Editoriale)

Elaboreremo il testo riga per riga. Poiché le righe possono contenere spazi e qualsiasi altro carattere, leggiamo ogni riga per intero con la funzione getline. La lettura continua fino alla fine dei dati di input — il numero di righe non è noto in anticipo.

In ogni riga esaminiamo i caratteri uno dopo l'altro. Se il carattere corrente è una lettera maiuscola dell'alfabeto latino, ossia '' ≤ ≤ '', allora il suo costo è uguale a s[i] - 'A' + 1: la lettera '' ha costo , '' – , ..., '' – . Tutti gli altri caratteri (lettere minuscole, cifre, segni di punteggiatura, spazi) vengono ignorati.

Il prodotto cercato verrà accumulato nella variabile . Inizialmente poniamo res = 1. Questo sarà anche la risposta se nel testo non è presente alcuna lettera maiuscola dell'alfabeto latino.

Il prodotto dei costi diventa rapidamente enorme, perciò prenderemo il resto modulo 10^9 + 7 dopo ogni moltiplicazione.

Esempio

Nell'esempio dato sono presenti le seguenti lettere maiuscole dell'alfabeto latino:

E (5), V (22), I (9), U (21), S (19), A (1)

Il costo delle lettere è indicato tra parentesi. Il prodotto di tutti i costi è uguale a

(5 ∗ 22 ∗ 9 ∗ 21 ∗ 19 ∗ 1) \mod 1000000007 = 395010

Implementazione dell'algoritmo

Definiamo il modulo rispetto al quale calcoleremo il prodotto.

#define MOD 1000000007

Il prodotto cercato verrà calcolato nella variabile . Inizialmente le assegneremo il valore .

res = 1;

Leggiamo il testo riga per riga fino alla fine dei dati di input.

while (getline(cin, s))
{

Esaminiamo i caratteri della riga corrente .

  for (i = 0; i < s.size(); i++)
  {

Se il carattere corrente è una lettera maiuscola dell'alfabeto latino, calcoliamo il suo costo e moltiplichiamo per modulo .

    if (('A' <= s[i]) && (s[i] <= 'Z'))
    {
      c = s[i] - 'A' + 1;
      res = (res * c) % MOD;
    }
  }
}

Stampiamo la risposta.

cout << res << endl;