题意
如果两个数字除了带问号的位以外都相同,我们称这两个数可以相互匹配
给你两个数,其中第一个数字里有一些问号,问有多少个大于第二个数的数字可以和第一个数字匹配
一开始懒得读题,到网上搜题意,结果居然没搜到这个题,于是决定贴一下代码
从高位到低位for循环搞一搞就好了,当然也可以dfs
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const int MAX=<<;
int n,m,len;
char str[];
char tmp[];
ll digit[];
ll nums[],ans;
void dfs(int pos,bool flag)
{
int i,j;
if(pos==len)
{
if(!flag)ans++;
return ;
}
if(str[pos]=='?')
{
if(!flag)ans+=digit[nums[pos]];
else
{
ans+=digit[nums[pos]-]*(''-tmp[pos]);
dfs(pos+,flag);
}
}
else
{
if(flag)
{
if(str[pos]<tmp[pos])return ;
else if(str[pos]==tmp[pos])dfs(pos+,flag);
else dfs(pos+,);
}
else dfs(pos+,);
}
}
int main()
{
int i,j;
digit[]=;
for(i=;i<;i++)digit[i]=digit[i-]*;
while(scanf("%s",str)!=EOF)
{
if(str[]=='#')return ;
scanf("%s",tmp);
memset(nums,-,sizeof(nums));
len=strlen(str);
nums[len]=;
for(i=len-;i>=;i--)
{
nums[i]=nums[i+];
if(str[i]=='?')nums[i]++;
}
ans=;
dfs(,);
printf("%lld\n",ans);
} }