Metni satır satır işleyeceğiz. Satırlar boşluk ve diğer herhangi bir karakteri içerebileceğinden, her satırı getline fonksiyonuyla tamamen okuyoruz. Girdi verisinin sonuna kadar okumaya devam ediyoruz — satır sayısı önceden bilinmiyor.
Her satırda karakterleri sırayla geziyoruz. Eğer mevcut karakter büyük bir Latin harfi ise, yani '' ≤ ≤ '', o zaman onun maliyeti s[i] - 'A' + 1'e eşittir: '' harfinin maliyeti , '' harfinin maliyeti , ..., '' harfinin maliyeti 'dır. Diğer tüm karakterleri (küçük harfler, rakamlar, noktalama işaretleri, boşluklar) atlıyoruz.
Aranan çarpımı değişkeninde biriktireceğiz. Başlangıçta res = 1 olarak alıyoruz. Metinde hiç büyük Latin harfi yoksa bu değer aynı zamanda cevap olacaktır.
Maliyetlerin çarpımı hızla çok büyük hale geldiğinden, her çarpma işleminden sonra 10^9 + 7 modülüne göre kalanı alacağız.
Örnek
Verilen örnekte aşağıdaki büyük Latin harfleri bulunmaktadır:
Harflerin maliyeti parantez içinde belirtilmiştir. Tüm maliyetlerin çarpımı şuna eşittir:
Algoritmanın Gerçekleştirilmesi
Çarpımı hesaplayacağımız modülü tanımlayalım.
#define MOD 1000000007Aranan çarpımı değişkeninde hesaplayacağız. Başlangıçta ona değerini atayalım.
res = 1;Girdi verisinin sonuna kadar metni satır satır okuyoruz.
while (getline(cin, s))
{Mevcut satırının karakterlerini geziyoruz.
for (i = 0; i < s.size(); i++)
{Eğer mevcut karakter büyük bir Latin harfi ise, onun maliyeti 'yi hesaplıyoruz ve 'i ile çarpıp 'a göre kalanını alıyoruz.
if (('A' <= s[i]) && (s[i] <= 'Z'))
{
c = s[i] - 'A' + 1;
res = (res * c) % MOD;
}
}
}Cevabı yazdırıyoruz.
cout << res << endl;