标签:
题目链接:点这里!!!!
题意:
给定两个长度为n(n<=1e5)的串s,w,串中能包含‘0‘~‘9‘,‘?‘,‘?‘可以代替‘0‘~‘9‘中任何一个数字。
问你能组成多少对特殊的串(‘?‘代替为数字后的s,w),使得存在(1<=i,j<=n)si<wi,sj>wj。
题解:
1、我们假设‘?’的总个数为num,则能够成的总情况为10^num。
2、我们可以通过求相反的情况来求出答案。
3、可以分为4种情况。
(1)已知存在(1<=i,j<=n)si<wi,sj>wj。我们的答案为sum。
(2)已知存在(1<=i<=n)si<wi,不存在(1<=j<=n)sj>wj。我们可以构造出所有(1<=i<=n)si<=wi的情况有ans种,则答案为sum-ans。
(3)已知存在(1<=i<=n)si>wi,不存在(1<=j<=n)sj<wj。我们可以构造出所有(1<=i<=n)si>=wi的情况有ans种,则答案为sum-ans。
(4)已知不存在(1<=i<=n)si>wi,(1<=j<=n)sj<wj。我们可以构造出所有(1<=i<=n)si<=wi的情况有ans1种,我们可以构造出所有(1<=i<=n)si<=wi的情况有ans2种,我们可以构造出所有(1<=i<=n)si<=wi的情况有ans3种。根据容斥我们可以得出答案为sum-(ans1+ans2-ans3)。
注意取模!!!!
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<sstream> #include<algorithm> #include<vector> #include<bitset> #include<set> #include<queue> #include<stack> #include<map> #include<cstdlib> #include<cmath> #define PI 2*asin(1.0) #define LL long long #define pb push_back #define pa pair<int,int> #define clr(a,b) memset(a,b,sizeof(a)) #define lson lr<<1,l,mid #define rson lr<<1|1,mid+1,r #define bug(x) printf("%d++++++++++++++++++++%d\n",x,x) #define key_value ch[ch[root][1]][0]C:\Program Files\Git\bin const LL MOD = 1E9+7; const LL N = 1e5+15; const int maxn = 5e5+15; const int letter = 130; const int INF = 1e17; const double pi=acos(-1.0); const double eps=1e-10; using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n; char s[N],w[N]; LL mpow(LL a,LL k){ LL ans=1; while(k){ if(k&1) ans=ans*a%MOD; a=a*a%MOD; k=k/2; } return ans; } int main(){ scanf("%d%s%s",&n,s,w); int flag1=0,flag2=0; LL num=0; for(int i=0;i<n;i++){ if(s[i]!='?'&&w[i]!='?'){ if(s[i]>w[i]) flag1=1; if(s[i]<w[i]) flag2=1; } if(s[i]=='?')num++; if(w[i]=='?')num++; } LL sum=mpow(10,num); if(flag1+flag2==2); else if(flag1==1){ LL ans=1; for(int i=0;i<n;i++){ if(s[i]=='?'||w[i]=='?'){ if(s[i]=='?'&&w[i]=='?') ans=ans*1ll*55%MOD; else if(s[i]=='?') ans=ans*1ll*(10-w[i]+'0')%MOD; else ans=ans*1ll*(s[i]-'0'+1)%MOD; } } sum=sum-ans; } else if(flag2==1){ LL ans=1; for(int i=0;i<n;i++){ if(s[i]=='?'||w[i]=='?'){ if(s[i]=='?'&&w[i]=='?') ans=ans*1ll*55%MOD; else if(s[i]=='?') ans=ans*1ll*(w[i]-'0'+1)%MOD; else ans=ans*1ll*(10-s[i]+'0')%MOD; } } sum=sum-ans; } else { LL ans1=1; for(int i=0;i<n;i++){ if(s[i]=='?'||w[i]=='?'){ if(s[i]=='?'&&w[i]=='?') ans1=ans1*1ll*55%MOD; else if(s[i]=='?') ans1=ans1*1ll*(10-w[i]+'0')%MOD; else ans1=ans1*1ll*(s[i]-'0'+1)%MOD; } } LL ans2=1; for(int i=0;i<n;i++){ if(s[i]=='?'||w[i]=='?'){ if(s[i]=='?'&&w[i]=='?') ans2=ans2*1ll*55%MOD; else if(s[i]=='?') ans2=ans2*1ll*(w[i]-'0'+1)%MOD; else ans2=ans2*1ll*(10-s[i]+'0')%MOD; } } LL ans3=1; for(int i=0;i<n;i++){ if(s[i]=='?'&&w[i]=='?') ans3=ans3*10ll%MOD; } sum=sum-(ans1+ans2-ans3); } sum%=MOD; sum=(sum+MOD)%MOD; printf("%I64d\n",sum); return 0; } /* 2 3? 57 2 5? 37 */
Codeforces Round #179 (Div. 2) B (codeforces 296b) Yaroslav and Two Strings
标签:
原文地址:http://blog.csdn.net/u014325920/article/details/51347427