题意:
数据范围:n<=1e3
解法:
令c[i][j]=(a[i][j]^b[i][j]),
那么问题变为是否存在一种操作方案,能够将矩阵c变为全0矩阵.
这种类型的题,先确定第一行如何操作,然后判断下面的行是否有解即可.
对于这题,第1行第j列如果为1,那么这一列都异或一下,
然后判断每一行是否为全0或者全1即可(全1可以通过一次操作变成全0).
code:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxm=1e3+5;
char a[maxm][maxm];
char b[maxm][maxm];
int c[maxm][maxm];
int f[maxm];
int n;
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>(a[i]+1);
}
for(int i=1;i<=n;i++){
cin>>(b[i]+1);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]-='0';
b[i][j]-='0';
c[i][j]=(a[i][j]^b[i][j]);
}
}
for(int i=1;i<=n;i++){
f[i]=0;
}
for(int j=1;j<=n;j++){//确定第一行
if(c[1][j]){
f[j]=1;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
c[i][j]^=f[j];
}
}
for(int i=1;i<=n;i++){
int cnt[2]={0};
for(int j=1;j<=n;j++){
cnt[c[i][j]]++;
}
if(cnt[0]&&cnt[1]){//既有1又有0,无解
cout<<"NO"<<endl;
return ;
}
}
cout<<"YES"<<endl;
}
signed main(){
ios::sync_with_stdio(0);
int T;cin>>T;
while(T--){
solve();
}
return 0;
}