Задача
Анаграммой слова называется любая перестановка всех букв слова. Например, из слова SOLO можно получить 12 анаграмм: SOLO, LOSO, OSLO, OLSO, OSOL, OLOS, SLOO, LSOO, OOLS, OOSL, LOOS, SOOL.
Напишите программу, которая выводит количество различных анаграмм, которые могут получиться из этого слова.
Входные данные
Слово, количество букв в котором не превышает 14.
Выходные данные
Количество различных анаграмм.
Тесты
№ | Ввод | Вывод |
1 | SOLO | 12 |
2 | ANAGRAM | 840 |
3 | PERMUTATION | 19958400 |
4 | AAAAA | 1 |
5 | AABBBCCC | 560 |
Код (string)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> #include <map> using namespace std; int main() { string s; map <char, int> m; cin >> s; int l = s.size(), count = 1; long long fact[15]; fact[1] = 1; for (int i = 2; i <= l; i++) //заполняем массив факториалов fact[i] = fact[i - 1] * i; for (int i = 0; i < l; i++) //подсчитываем повторения ++m[s[i]]; for (auto it = m.begin(); it != m.end(); it++) if (it -> second > 1) count *= fact[it -> second]; cout << fact[l] / count; return 0; } |
Код (c-string)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> #include <cstring> #include <map> using namespace std; int main() { char s[15]; //равносильно char * s = new char [15], где 15 - максимальный размер строки map <char, int> m; cin >> s; int l, count = 1; l = strlen(s); long long fact[15]; fact[1] = 1; for (int i = 2; i <= l; i++) //заполняем массив факториалов fact[i] = fact[i - 1] * i; for (int i = 0; i < l; i++) //подсчитываем повторения ++m[s[i]]; for (auto it = m.begin(); it != m.end(); it++) if (it -> second > 1) count *= fact[it -> second]; cout << fact[l] / count; return 0; } |
Решение
Данная задача решается с помощью единой формулы \begin{equation} N_s =\frac {length!}{p_1! × p_2! × \ldots\ × p_n!}\end{equation} где $ length$ — длина строки, а $p_i$ — количество повторений одной буквы $(i = 1, 2, \ldots\ , n$, $ n$ — количество различных букв). Буквы, повторяющиеся один раз, можем опустить, так как их факториал даст единицу, что никак не повлияет на результат.
Длину строки найдем с помощью метода
size()(или
strlen()), а количество повторений для удобства будем подсчитывать в контейнере
map.