#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long LL; const int MM=1000000007; const int MN=100005; char ss[2][MN]; LL sum[MN],s1[MN],len; int lac,flag; LL qmod(LL t){ if (t==0) return 1; if (t==1) return 2; LL res=qmod(t>>1); res=(res*res)%MM; if (t&1) res=(res<<1)%MM; return res; } void writeans(){ ss[0][lac+1]='1'; ss[1][lac+1]='1'; if (ss[0][lac]=='?' && ss[1][lac]=='?'){ if (s1[lac]&1){ ss[0][lac]='1'; ss[1][lac]='0'; } else { ss[0][lac]='0'; ss[1][lac]='1'; } } else if (ss[0][lac]=='?') ss[0][lac]=='0'+((ss[1][lac]-'0')^1); else if (ss[1][lac]=='?') ss[1][lac]=='0'+((ss[0][lac]-'0')^1); int st; if (ss[0][lac]=='0') st=0; else st=1; for (int i=0; ilac){ printf("0"); continue; } if ((s1[lac]%2)^st) printf("1"); else printf("0"); } else if (ss[0][i]=='?') printf("%c",ss[1][i]); else printf("%c",ss[0][i]); puts(""); for (int i=0; ilac){ printf("0"); continue; } if ((s1[lac]%2)^st) printf("1"); else printf("0"); } else if (ss[1][i]=='?') printf("%c",ss[0][i]); else printf("%c",ss[1][i]); puts(""); } LL calc(int k){ LL tmp; if (ss[0][k]=='?' && ss[1][k]=='?') return qmod(sum[k]); if (ss[0][k]!='0' && ss[1][k]!='1') if (sum[k]>0) return qmod(sum[k]-1); else if (s1[k]&1) return 1; if (ss[0][k]!='1' && ss[1][k]!='0') if (sum[k]>0) return qmod(sum[k]-1); else if (!(s1[k]&1)) return 1; return 0; } LL gao1(int t){ LL res=0; if (ss[0][t+1]=='0' || ss[1][t+1]=='0') return 0; for (int i=t+2; i0 && lac==-1) lac=t; if (res>1) flag=1; return res; } LL gao0(){ int i,j; LL res=0; for (i=len; i>0; i--){ if (ss[0][i]!='?' && ss[1][i]!='?' && ss[0][i]!=ss[1][i]) return res; if (ss[0][i]=='1' || ss[1][i]=='1'){ res=(res+calc(i-1))%MM; if (res>0 && lac==-1) lac=i-1; if (res>1) flag=1; return res; } if (ss[0][i]=='?' && ss[1][i]=='?'){ res=(res+calc(i-1))%MM; if (res>0 && lac==-1) lac=i-1; if (res>1) flag=1; } } return res; } int main(){ //freopen("in","r",stdin); int T,cas=0; scanf("%d",&T); while (T--){ scanf("%s%s",ss[0],ss[1]); int i,j,k=0; len=strlen(ss[0]); for (i=0; i=2){ puts("Impossible"); continue; } sum[0]=0; s1[0]=0; for (i=1; i<=len; i++){ sum[i]=sum[i-1]; s1[i]=s1[i-1]; if (ss[0][i-1]=='?' && ss[1][i-1]=='?') sum[i]++; if (ss[0][i-1]=='1' || ss[1][i-1]=='1') s1[i]++; } ss[0][len]=ss[1][len]='?'; lac=-1; flag=0; int res=0; if (k) res=int(gao1(j)%MM); else res=int(gao0()%MM); if (lac==-1){ puts("Impossible"); continue; } if (flag){ printf("Ambiguous %d\n",res); continue; } writeans(); } return 0; }