#include using namespace std; #define tsolve int t; cin >> t; while (t--) solve #define all(x) ::begin(x), ::end(x) #define sz(x) (ll)::size(x) using ll = long long; using ld = long double; vector> g; vector> comps; vector vis; void dfs(int u){ vis[u] = true; comps.back().push_back(u); for(int v : g[u]){ if(!vis[v]) dfs(v); } } void solve() { int n; cin >> n; vector mat(n); vector> ef, es; for(int i = 0; i < n; i++){ cin >> mat[i]; for(int j = 0; j < i; j++){ if(mat[i][j] == 'F') ef.emplace_back(i, j); if(mat[i][j] == 'S') es.emplace_back(i, j); } } bool swapped = false; if(sz(ef) < sz(es)) swap(es, ef), swapped = true; g.resize(n); for(auto [u, v] : ef){ g[u].push_back(v); g[v].push_back(u); } vis.resize(n); vector> cs; for(int i = 0; i < n; i++){ if(!vis[i]){ comps.push_back(vector()); dfs(i); cs.emplace_back(sz(comps.back()), sz(comps)-1); } } sort(cs.rbegin(), cs.rend()); int goal = (3*n + 3) / 4 + 1, cur = 0; set red; for(auto [s, ind] : cs){ if(cur + s <= goal){ cur += s; for(int i : comps[ind]) red.insert(i); } } for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(mat[i][j] != '?') continue; char write; if(red.contains(i) && red.contains(j)) write = 'F'; else write = 'S'; if(swapped){ if(write == 'F') write = 'S'; else write = 'F'; } mat[i][j] = write; } } for(int i = 0; i < n; i++) cout << mat[i] << "\n"; } int main() { cin.tie(0)->sync_with_stdio(false); cout << setprecision(16); solve(); }