#include <bits/stdc++.h>   int n;   char str[50];   int F[50], sz[50];   inline int find(int x) { return x == F[x] ? x : F[x] = find(F[x]); }   inline void merge(int x, int y) {     x = find(x);     y = find(y);     if (x == y) return;     F[y] = x;     sz[x] += sz[y];   }   std::vector<int> G[55];   int id[66];   int e[25];   int f[(1 << 23) + 5], g[(1 << 23) + 5], coe[(1 << 23) + 5];   int main() {     scanf( %d , &n);     for (int i = 0; i <= n - 1; ++i) F[i] = i, sz[i] = 1;     for (int i = 0; i <= n - 1; ++i) {       scanf( %s , str);       for (int j = i + 1; j <= n - 1; ++j) {         if (str[j] ==  A ) merge(i, j);         if (str[j] ==  X ) G[i].emplace_back(j), G[j].emplace_back(i);       }     }     int ans = n - 1;     n = 0;     for (int i = 0; i <= ans; ++i) id[i] = find(i);     for (int i = 0; i <= ans; ++i)       for (auto x : G[i])         if (id[i] == id[x]) {           puts( -1 );           exit(0);         }     for (int i = 0; i <= ans; ++i) {       if (sz[id[i]] == 1) {         id[i] = -1;         continue;       }       if (id[i] != i) {         id[i] = id[id[i]];         continue;       }       id[i] = n++;     }     if (n <= 1) {       printf( %d n , ans + n);       return 0;     }     assert(n <= 23);     for (int i = 0; i <= ans; ++i)       for (auto x : G[i])         if (~id[i] && ~id[x]) e[id[i]] |= (1 << id[x]);     f[0] = coe[0] = 1;     for (int S = 1; S <= (1 << n) - 1; ++S) {       int lb = __builtin_ctz(S);       f[S] = (!(e[lb] & S)) & f[S ^ (1 << lb)];       coe[S] = -coe[S ^ (1 << lb)];     }     for (int i = 0; i <= n - 1; ++i) {       for (int S = 0; S <= (1 << n) - 1; ++S) {         if ((S >> i) & 1) f[S] += f[S ^ (1 << i)];       }     }     for (int i = 0; i <= (1 << n) - 1; ++i) g[i] = f[i];     for (int k = 1; k <= n; ++k) {       auto chk = [&]() {         int ans = 0;         for (int S = 0; S <= (1 << n) - 1; ++S) ans += g[S] * coe[S];         return ans != 0;       };       if (chk()) {         printf( %d n , ans + k);         return 0;       }       for (int S = 0; S <= (1 << n) - 1; ++S) g[S] *= f[S];     }     return 0;   }   