【问题描述】给定一个可以带通配符问号的正整数W,问号可以代表任意一个一位数字。再给定一个正整数X,和W具有同样的长度。问有多少个整数符合W的形式并且比X大?
【输入形式】多组数据,每组数据两行,第一行是W,第二行是X,它们长度相同,在[1..10]之间。
【输出形式】每行一个整数表示结果。
【样例输入】
36?1?8
236428
8?3
910
?
5
【样例输出】
100
0
4
【思路分析】
贪心。先计数?的个数,设为。从高位向低位贪心,对于第一个?,前方W的位大于X的位,则直接输出答案
;若小于,则输出答案0;若相等,先让答案加上
,再令该位相等,递归判断后续序列。
#include <iostream>
#include <vector>
#include <unordered_map>
#include <map>
#include <cmath>
#include <algorithm>
#include <climits>
#include <stack>
#include <cstring>
#include <iomanip>
#include <set>
#include <queue>
#define i64 long long
using namespace std;
i64 check(string s, string n, i64 cnt) {
if (cnt == 0) {
if (s>n) return 1;
else return 0;
}
i64 flag = 0, ans = 1;
for (int i = 0; i < s.size(); ++i) {
if (s[i] == '?') {
if (flag == 0) {
s[i] = n[i];
ans *= ('9' - n[i]) * pow(10, cnt - 1) + check(s, n, cnt - 1);
} else if (flag == 1) ans = pow(10, cnt);
else ans = 0;
break;
}
if (s[i] == n[i]) flag = 0;
else if (flag != 2 && s[i] > n[i]) flag = 1;
else if (flag != 1) flag = 2;
}
return ans;
}
void solve() {
string s, n;
while (cin >> s >> n) {
i64 cnt = 0;
for (const auto &item: s) {
if (item == '?') ++cnt;
}
cout << check(s, n, cnt) << endl;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t = 1;
// cin >> t;
while (t--) {
solve();
}
return 0;
}