#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
#define ll long long
#define for1(i, s, t) for (int i(s); i<=t; ++i)
#define for2(i, t, s) for (int i(t); i>=s; --i)
#define for3(i, vec) for (auto i: vec)
#define INF 0x3f3f3f3f
#define opb pop_back
#define pb push_back
#define pf push_front
#define opf pop_front
#define fi first
#define se second
#define gc() getchar()
#define pc(x) putchar(x);
#define sp pc(' ');
#define el pc('\n');
#define pr(x) printf(x);
#define Yes pr("YES");
#define No pr("NO");
#define err assert(0);
ll re(){
ll x(0), f(1);
char ch;
while ((ch = gc()) < 48) f = ch == '-' ? -1 : 1;
do{
x = (x << 1) + (x << 3) + (ch ^ 48);
}while ((ch = gc()) > 47);
return x * f;
}
void uwr(ll x){
ll tmp(x/10);
if (tmp) uwr(tmp);
pc(x-(tmp<<1)-(tmp<<3)^48);
}
void wr(ll x){
if (x < 0){
pc('-');
x = -x;
}
uwr(x);
}
int ind, u;
vector<int> vec1, vec2;
vector<int> e[200001];
queue<int> que;
string a, b;
bitset<200001> vis;
bool bfs(){
while (!que.empty()) que.pop();
que.push(0);
while (!que.empty()){
u = que.front();
vis.set(u);
que.pop();
if (u == a.size()-1) return true;
for (auto i: e[u]){
if (!vis.test(i)) que.push(i);
}
}
return false;
}
void solve(){
cin >> a >> b;
vec1.clear();
vec2.clear();
for (int i(0); i<a.size(); ++i){
vis.reset(i);
e[i].clear();
if (a[i] == b[i]){
if (a[i] ^ 48) vec2.push_back(i);
else vec1.push_back(i);
}
}
for1(i, 0, int(vec1.size())-2) e[vec1[i]].push_back(vec1[i+1]);
for1(i, 0, int(vec2.size())-2) e[vec2[i]].push_back(vec2[i+1]);
ind = 0;
for3(i, vec1){
while (vec2[ind] <= i && ind<vec2.size()-1) ++ind;
if (vec2[ind] == i+1) e[i].push_back(vec2[ind]);
}
ind = 0;
for3(i, vec2){
while (vec1[ind] <= i && ind<vec1.size()-1) ++ind;
if (vec1[ind] == i+1) e[i].push_back(vec1[ind]);
}
cout << (bfs() ? "YES" : "NO");
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t(1);
cin >> t;
while (t--){
solve();
cout << '\n';
}
return 0;
}