import
java.util.*;
public
class
Main {
static
class
BitsetComparator
implements
Comparator<BitSet> {
public
int
compare(BitSet p1, BitSet p2)
{
return
p1.toString().compareTo(p2.toString());
}
}
static
int
minCost(List<List<Integer> > a,
List<List<Integer> > t)
{
int
n = a.size();
int
m = a.get(
0
).size();
List<BitSet> mat =
new
ArrayList<>(n);
List<BitSet> tar =
new
ArrayList<>(n);
for
(
int
i =
0
; i < n; i++) {
StringBuilder sb =
new
StringBuilder();
for
(
int
j =
0
; j < m; j++) {
sb.append(a.get(i).get(j));
}
mat.add(
i, BitSet.valueOf(
new
long
[] {
Long.parseLong(sb.toString(),
2
) }));
}
for
(
int
i =
0
; i < n; i++) {
StringBuilder sb =
new
StringBuilder();
for
(
int
j =
0
; j < m; j++) {
sb.append(t.get(i).get(j));
}
tar.add(
i, BitSet.valueOf(
new
long
[] {
Long.parseLong(sb.toString(),
2
) }));
}
Collections.sort(tar,
new
BitsetComparator());
int
ans = Integer.MAX_VALUE;
for
(
int
i =
0
; i < n; i++) {
List<BitSet> copy =
new
ArrayList<>(mat);
BitSet flip = (BitSet)copy.get(i).clone();
flip.xor(tar.get(
0
));
for
(
int
j =
0
; j < copy.size(); j++) {
copy.get(j).xor(flip);
}
Collections.sort(copy,
new
BitsetComparator());
if
(copy.equals(tar)) {
ans = Math.min(ans, flip.cardinality());
}
}
if
(ans == Integer.MAX_VALUE) {
return
-
1
;
}
return
ans;
}
public
static
void
main(String[] args)
{
List<List<Integer> > matrix = Arrays.asList(
Arrays.asList(
0
,
0
), Arrays.asList(
1
,
0
),
Arrays.asList(
1
,
1
));
List<List<Integer> > target = Arrays.asList(
Arrays.asList(
0
,
1
), Arrays.asList(
1
,
0
),
Arrays.asList(
1
,
1
));
System.out.println(minCost(matrix, target));
}
}