题意:
两串长为n的字符串,若满足s[ i ] >w[ i ] && s[ j ] < w[ j ] 那么这两串字符就是non-comparable
给出的字符串是由0-9以及?组成的,?是未知的意思,可代替0-9任意一个数,
问一共有多少个non-comparable
解题思路:
数字的处理很简单,两者比一下就可以了,主要是?难处理,提及容斥原理,那么不难想到
用ans记录所有的情况,那么每遇到一个?就乘以10(不考虑大小,0-9十个数均可填)
用res1记录s1[ i ] > s2[ i ]
用res2记录s1[ i ] < s2[ i ]
用res3记录s1[ i ] = s2[ i ]
最终结果就是ans - res1 - res2 + res3( 由于解题过程取模了,注意正负 )
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
#define mod 1000000007
char s1[100050],s2[100050];
__int64 res1,res2,res3,n;;
void init1()
{
for(int i=0;i<n;i++)
{
if(s1[i]=='?' && s2[i]=='?') res1 = (res1*55)%mod ;
else if(s1[i]=='?' && s2[i]!='?') res1 = (res1*(10-(s2[i]-'0')))%mod;
else if(s1[i]!='?' && s2[i]=='?') res1 = (res1*(s1[i]-'0'+1))%mod;
else if((s1[i]-'0')<(s2[i]-'0'))
{
res1=0;
break;
}
}
res1 = res1%mod;
}
void init2()
{
for(int i=0;i<n;i++)
{
if(s1[i]=='?' && s2[i]=='?') res2 = (res2*55)%mod;
else if(s1[i]=='?' && s2[i]!='?') res2 = (res2*(s2[i]-'0'+1))%mod;
else if(s1[i]!='?' && s2[i]=='?') res2 = (res2*(10-(s1[i]-'0')))%mod;
else if((s1[i]-'0')>(s2[i]-'0'))
{
res2 = 0;
break;
}
}
res2 = res2%mod;
}
void init3()
{
for(int i=0;i<n;i++)
{
if(s1[i]=='?' && s2[i]=='?') res3 = (res3*10)%mod;
else if((s1[i]=='?' && s2[i]!='?') || (s1[i]!='?' && s2[i]=='?')) res2=res2*1;
else if((s1[i]-'0')!=(s2[i]-'0'))
{
res3=0;
break;
}
}
res3 = res3%mod;
}
int main()
{
while(cin>>n)
{
scanf("%s%s",s1,s2);
__int64 ans = 1;
for(int i=0;i<n;i++)
{
if(s1[i]=='?') ans = (ans*10)%mod;
if(s2[i]=='?') ans = (ans*10)%mod;
}
res1 = res2 = res3 = 1;
init1();
init2();
init3();
cout<<(ans-res1+mod-res2+mod+res3)%mod<<endl;
}
return 0;
}