题意:给出两个
这道题居然用了一个非正解的模拟过了。
很明显,先把
同理,再遍历一遍,这次把同列的取反。
这样我们就把整个
正解解法:先考虑最简单的情况,仅有
接下来考虑
对于
my code:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<string>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
int t;
int n,m,r,c;
string a[1010100],b[1010100];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>t;
while(t--)
{
bool flag=0;
cin>>n>>m>>r>>c;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
cin>>b[i];
for(int i=0;i+r<n;i++)
for(int j=0;j<m;j++)
if(a[i][j]!=b[i][j])
{
a[i][j]^=1;
a[i+r][j]^=1;
}//将不同的先用行变换
for(int i=0;i<n;i++)
for(int j=0;j+c<m;j++)
if(a[i][j]!=b[i][j])
{
a[i][j]^=1;
a[i][j+c]^=1;
}//再用列变换
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
flag|=(a[i][j]!=b[i][j]);//在计算还有没有不同的
cout<<(flag?"No":"Yes")<<endl;
}
return 0;
}
correct code:
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define SZ(x) ((int)x.size())
#define L(i,u) for (register int i=head[u]; i; i=nxt[i])
#define rep(i,a,b) for (register int i=(a); i<=(b); i++)
#define per(i,a,b) for (register int i=(a); i>=(b); i--)
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef pair<int,int> Pii;
typedef vector<int> Vi;
template<class T> inline void read(T &x){
x=0; char c=getchar(); int f=1;
while (!isdigit(c)) {if (c=='-') f=-1; c=getchar();}
while (isdigit(c)) {x=x*10+c-'0'; c=getchar();} x*=f;
}
template<class T> inline void umin(T &x, T y){x=x<y?x:y;}
template<class T> inline void umax(T &x, T y){x=x>y?x:y;}
inline ui R() {
static ui seed=416;
return seed^=seed>>5,seed^=seed<<17,seed^=seed>>13;
}
int n,m,r,c,A[1000030],tot,s[3][3];
int main() {
int T;read(T);while(T--){
read(n);read(m);read(r);read(c);memset(s,0,sizeof(s));
rep(i,1,n){
static char t[1002000];scanf("%s",t+1);
rep(j,1,m){int x=t[j]-'0';s[i%r][j%c]^=x;}
}
rep(i,1,n){
static char t[1002000];scanf("%s",t+1);
rep(j,1,m){int x=t[j]-'0';s[i%r][j%c]^=x;}
}
bool ok=1;
rep(i,0,r-1)rep(j,0,c-1)ok&=!s[i][j];
printf("%s\n",ok?"Yes":"No");
}
return 0;
}