CF316A2.Special Task
原题链接:10967.Special Task2025-07-27 19:03:26
发布于:浙江
#include <iostream>
#include <unordered_set>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
unordered_set<char> letters;
int m = 0; // 问号的数量
bool first_is_letter = false;
for (int i = 0; i < s.size(); ++i) {
char c = s[i];
if (c == '?') {
m++;
} else if (c >= 'A' && c <= 'J') {
letters.insert(c);
if (i == 0) {
first_is_letter = true;
}
}
}
int k = letters.size();
if (k > 10) {
cout << 0 << endl;
return 0;
}
// 计算字母的可能排列数
long long letters_count = 1;
if (k > 0) {
if (first_is_letter) {
// 第一个字符是字母,有9种选择(1-9)
letters_count = 9;
// 剩余k-1个字母从9个数字中选择并排列
for (int i = 0; i < k - 1; ++i) {
letters_count *= (9 - i);
}
} else {
// 从10个数字中选择k个并排列
for (int i = 0; i < k; ++i) {
letters_count *= (10 - i);
}
}
}
// 计算问号的可能组合数(10^m)
long long question_count = 1;
for (int i = 0; i < m; ++i) {
question_count *= 10;
}
// 总可能数为两者的乘积
cout << letters_count * question_count << endl;
return 0;
}
这里空空如也
有帮助,赞一个