RT,WA on test #9
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define int long long
int n,m,a[1000001][4],dp[1000001][2][2][2];
signed main()
{
scanf("%lld%lld",&n,&m);
if(n>=4&&m>=4)
{
puts("-1");
return 0;
}
if(n<m)
for(register int i=1;i<=n;++i)
for(register int j=1;j<=m;++j)
{
a[j][i]=getchar()-'0';
while(a[j][i]!=1&&a[j][i]!=0)
a[j][i]=getchar()-'0';
}
else
{
for(register int i=1;i<=n;++i)
for(register int j=1;j<=m;++j)
{
a[i][j]=getchar()-'0';
while(a[i][j]!=1&&a[i][j]!=0)
a[i][j]=getchar()-'0';
}
n^=m^=n^=m;
}
if(n==1)
{
puts("0");
return 0;
}
for(register int p=2;p<=m;++p)
for(register int i=0;i<=1;++i)
for(register int j=0;j<=1;++j)
for(register int k=0;k<=1;++k)
dp[p][i][j][k]=1ll<<40;
for(register int i=0;i<=1;++i)
for(register int j=0;j<=1;++j)
for(register int k=0;k<=1;++k)
dp[1][i][j][k]=(a[1][1]^i)+(a[1][2]^j)+(a[1][3]^k);
for(register int i=2;i<=m;++i)
for(register int l=0;l<(1<<n);++l)
for(register int r=0;r<(1<<n);++r)
{
int aa=l&1,b=(l>>1)&1,c=(l>>2)&1,d=r&1,e=(r>>1)&1,f=(r>>2)&1;
if((aa^b^d^e)&&(b^c^e^f))
dp[i][d][e][f]=min(dp[i][d][e][f],dp[i-1][aa][b][c]+(a[i][1]^d)+(a[i][2]^e)+(a[i][3]^f));
}
int ans=1ll<<60;
for(register int i=0;i<=1;++i)
for(register int j=0;j<=1;++j)
for(register int k=0;k<=1;++k)
ans=min(ans,dp[m][i][j][k]);
printf("%lld\n",ans);
return 0;
}