正解我不太懂,最后使用clj的神暴力水过去了,总而言之我还是太弱了
typedef vector<int> VI;
const int N = 40;
map<VI, int> Hash;
queue<VI> Q;
int n;
string Dat[N];
inline void Input() {
scanf("%d", &n);
Rep(i, n) cin >> Dat[i];
}
inline void write(int Ans) {
printf("%d\n", Ans);
exit(0);
}
inline void Solve() {
VI u, v, T;
Rep(i, n)
if(Dat[i] == "") write(0);
else u.pub(i << 6);
Hash[u] = 0;
for(Q.push(u); sz(Q); ) {
u = Q.front(), Q.pop();
int H = Hash[u], Cnt;
For(C, '0', '1') {
Cnt = 0, v.clear();
Rep(i, sz(u)) {
int Which = u[i] >> 6, Where = u[i] & 63;
if(Dat[Which][Where] ^ C) continue;
if(++Where == sz(Dat[Which])) {
++Cnt;
Rep(j, n) v.pub(j << 6);
} else v.pub(Which << 6 | Where);
}
if(Cnt >= 3) write(H + 1);
sort(all(v)), T.clear();
Rep(i, sz(v))
if(i < 3 || v[i] ^ v[i - 3]) T.pub(v[i]);
int &TH = Hash[T];
if(sz(T) && !TH) TH = H + 1, Q.push(T);
}
}
write(-1);
}
int main() {
#ifndef ONLINE_JUDGE
SETIO("1080");
#endif
Input();
Solve();
return 0;
}