龙神的01矩阵
题号:NC231671
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

龙神对字符串十分擅长,常常在赛场上使用后缀数组,后缀自动机,后缀树等龙神眼中的低级竖锯解构来解决问题。
龙神为了检测你对01字符串的敏感性,请你帮助龙神解决一下问题:

龙神给定你一个01矩阵,在一次翻转过程中,你可以将任何一位的01翻转,即0变成11变成0
龙神想要经过若干次翻转后,使得每一行的异或值等于r_i,每一列的异或值等于c_i;

请你计算并输出最少的翻转次数,使得矩阵的第i行的异或值等于r_i,矩阵的第i列的异或值等于c_i
如果无论如何变换都不能达到要求,请输出-1

如果a,b两个值不相同,则异或结果为1。如果a,b两个值相同,异或结果为0

对于多个数的异或和,满足结合律

输入描述:

第一行给定一个nm
接下来n行,每行m个数,表示一个01矩阵。
下面一行n个数,第i个数表示第i行的目标异或值r_i
最后一行m个数,第i个数表示第i列的目标异或值c_i

输出描述:

输出一个整数,表示最小的翻转次数。
示例1

输入

复制
1 1
1
0 
1

输出

复制
-1
示例2

输入

复制
2 2
0 0
1 1
0 0
1 1

输出

复制
0