#include #define pii pair using namespace std; int t[26]; int tata (int nod) { if(t[nod] == 0 || t[nod] == nod) return nod; return t[nod] = tata(t[nod]); } void unite (int a, int b) { a = tata(a); b = tata(b); if(a!=b) t[a] = b; } int sz[26]; int in_comp[30]; char mat[50][50]; vector>S; vector>F; struct ura { int val,pz; }; vectorv; bool cmp (ura a, ura b) { return a.val > b.val; } void solve() { int n; cin >> n; for(int i = 1 ; i<= n; ++i) { for(int j = 1; j <= n; ++ j) { cin >> mat[i][j]; if(i < j && mat[i][j] != '?') { if(mat[i][j] == 'S') S.push_back(make_pair(i,j)); else F.push_back(make_pair(i,j)); } } } int ok = 0; if(S.size() > F.size()) { swap(S,F); ok = 1; } for(auto pi:F) // => intre comp o sa fie toate S { int a = pi.first, b = pi.second; unite(a,b); } for(int i = 1; i <= n; ++i) ++sz[tata(i)]; for(int i = 1; i <= n; ++i) { if(i == tata(i)) v.push_back({sz[i], i}); } sort(v.begin(),v.end(),cmp); int s = 0; int obj = (n+2)/4; for(auto a:v) { if(s+a.val <= obj) { s += a.val; in_comp[a.pz] = 1; //cout << a.pz<<'\n'; } } //cout<> T; while(T--) { solve(); } return 0; }