Cho chuỗi, đếm số cách sắp xếp lại các ký tự mà vị trí tương đối của nguyên âm và phụ âm không đổi.
Cách làm
- Đếm số nguyên âm (v) và phụ âm (c)
- Số cách sắp xếp nguyên âm: v! / (tần suất mỗi nguyên âm!)
- Số cách sắp xếp phụ âm: c! / (tần suất mỗi phụ âm!)
- Kết quả = tích 2 giá trị trên
Chương trình
#include <iostream>
using namespace std;
long long fact(int n) {
return (n <= 1) ? 1 : n * fact(n-1);
}
long long countArrangements(string str) {
long long freq[26] = {0};
int v = 0, c = 0;
for (char ch : str) {
freq[ch - 'a']++;
if (strchr("aeiou", ch)) v++; else c++;
}
long long vow = fact(v);
vow /= fact(freq[0]); // a
vow /= fact(freq[4]); // e
vow /= fact(freq[8]); // i
vow /= fact(freq[14]); // o
vow /= fact(freq[20]); // u
long long con = fact(c);
for (int i = 0; i < 26; i++)
if (i!=0 && i!=4 && i!=8 && i!=14 && i!=20)
con /= fact(freq[i]);
return vow * con;
}
int main() {
string str = "computer";
cout << "So cach sap xep: " << countArrangements(str);
return 0;
}
Kết quả
So cach sap xep: 720