Помогите разобраться с фрагментом кода

Программа считает кол-во анаграмм введенного слова (ABCD - 12)

#include <iostream>
#include <string>

unsigned long long fact(int n)
{
    if (n == 0 || n == 1)
        return 1;
    return fact(n - 1) * n;
}

int main()
{
    std::string s;
    std::cin >> s;
    int mas[27] = { 0 };

    for (int i = 0; i < s.length(); ++i)
        mas[s[i] - 'A']++;

    unsigned long long tmp = fact(s.length());
    for (int i = 0; i < 27; ++i)
        tmp /= fact(mas[i]);
    std::cout << tmp;
    system("pause");
    return 0;
}

Что делает эта строка ?

for (int i = 0; i < s.length(); ++i)
            mas[s[i] - 'A']++;

Ответы (1 шт):

Автор решения: Zhihar

Что делает эта строка ?

for (int i = 0; i < s.length(); ++i)
            mas[s[i] - 'A']++;

считает, сколько раз встречается каждая уникальная буква в слове

Поскольку букв в английском алфавите 26, то letter - 'A' каждой букве дает свой индекс от 0 до 25, а потом алгоритм анализирует данные по всем буквам

for (int i = 0; i < 27; ++i)

(правда тут не понятно почему взято 28 букв)

А сама программа вычисляет кол-во перестановок с повторениями по формуле

введите сюда описание изображения

для чего и считает кол-во уникальных букв

P.S.

кстати программа очень неэффективная, поскольку если представить очень большое слово, например

pneumonoultramicroscopicsilicovolcanokoniosis – заболевание лёгких, вызванное вдыханием кремнезема или кварцевой пыли

то необходимо будет вычислить 45! ~ 1,19e+56, который в 64 битное целое (long long) ну никак не влезет

так что предложенный алгоритм способен осилить только 21 буквенные слова

→ Ссылка