Costo de las letras#11610

Costo de las letras (Editorial)

Procesaremos el texto línea por línea. Dado que las líneas pueden contener espacios y cualquier otro carácter, leemos cada línea completa con la función getline. Continuamos leyendo hasta el final de los datos de entrada — la cantidad de líneas no se conoce de antemano.

En cada línea recorremos los caracteres uno por uno. Si el carácter actual es una letra latina mayúscula, es decir '' ≤ ≤ '', entonces su costo es igual a s[i] - 'A' + 1: la letra '' tiene costo , '' – , ..., '' – . Todos los demás caracteres (letras minúsculas, dígitos, signos de puntuación, espacios) se omiten.

El producto buscado lo iremos acumulando en la variable . Inicialmente ponemos res = 1. Este será también el resultado si en el texto no hay ninguna letra latina mayúscula.

El producto de los costos crece rápidamente hasta volverse enorme, por lo que tomaremos el resto módulo 10^9 + 7 después de cada multiplicación.

Ejemplo

En el ejemplo dado se encuentran las siguientes letras latinas mayúsculas:

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

El costo de las letras se indica entre paréntesis. El producto de todos los costos es igual a

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

Implementación del algoritmo

Definimos el módulo con respecto al cual calcularemos el producto.

#define MOD 1000000007

El producto buscado lo calcularemos en la variable . Inicialmente le asignamos el valor .

res = 1;

Leemos el texto línea por línea hasta el final de los datos de entrada.

while (getline(cin, s))
{

Recorremos los caracteres de la línea actual .

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

Si el carácter actual es una letra latina mayúscula, calculamos su costo y multiplicamos por módulo .

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

Mostramos el resultado.

cout << res << endl;