#include using namespace std; #define Dv(v) for (auto x : v) cerr << x << ' '; cerr << endl; #define D(x) cerr << #x << " = " << x << ", " #define x first #define y second using ll = long long; using vi = vector; using vvi = vector; bool cota(int a2, int n) { int k = (3*n+3)/4; return a2 < (n-1 -k); } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; vector mapa(n); vector> c1, c2; set a1, a2; char s = 'S', f = 'F'; for(int i = 0; i < n; ++i) cin >> mapa[i]; for(int i = 0; i < n; ++i) for(int j = i+1; j < n; ++j) if(mapa[i][j] == s) c1.push_back({i, j}); else if(mapa[i][j] == f) c2.push_back({i, j}); a1 = a2 = set(); for(auto p: c1) a1.insert(p.x), a1.insert(p.y); for(auto p: c2) if(cota(a2.size(), n) && a1.find(p.x) == a1.end() && a2.find(p.x) == a2.end() && a1.find(p.y) == a1.end() && a2.find(p.y) == a2.end()) a2.insert(p.x); for(auto p: c2) if(cota(a2.size(), n) && a1.find(p.x) == a1.end() && a2.find(p.x) == a2.end()) a2.insert(p.x); else if(cota(a2.size(), n) && a1.find(p.y) == a1.end() && a2.find(p.y) == a2.end()) a2.insert(p.y); for(int i = 0; i < n; ++i) if(cota(a2.size(), n) && a1.find(i) == a1.end() && a2.find(i) == a2.end()) a2.insert(i); for(int i = 0; i < n; ++i) if(a1.find(i) == a1.end() && a2.find(i) == a2.end()) a1.insert(i); int t = 0; for(int i: a1) for(int j: a1) if(mapa[i][j] == f) t++; t /= 2; int k = (3*n+3)/4; if(t + 2*a2.size() <= k && a1.size() <= k+1 && a1.size()+a2.size() == n) { for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { if(mapa[i][j] != '?') cout << mapa[i][j]; else if(a1.find(i) != a1.end() && a1.find(j) != a1.end()) cout << s; else cout << f; } cout << '\n'; } return 0; } // cerr << a2.size() << ' ' << a1.size() << ' ' << cota(a2.size(), n) << endl; swap(c1, c2); swap(f, s); a1 = a2 = set(); for(auto p: c1) a1.insert(p.x), a1.insert(p.y); for(auto p: c2) if(cota(a2.size(), n) && a1.find(p.x) == a1.end() && a2.find(p.x) == a2.end() && a1.find(p.y) == a1.end() && a2.find(p.y) == a2.end()) a2.insert(p.x); for(auto p: c2) if(cota(a2.size(), n) && a1.find(p.x) == a1.end() && a2.find(p.x) == a2.end()) a2.insert(p.x); else if(cota(a2.size(), n) && a1.find(p.y) == a1.end() && a2.find(p.y) == a2.end()) a2.insert(p.y); for(int i = 0; i < n; ++i) if(cota(a2.size(), n) && a1.find(i) == a1.end() && a2.find(i) == a2.end()) a2.insert(i); for(int i = 0; i < n; ++i) if(a1.find(i) == a1.end() && a2.find(i) == a2.end()) a1.insert(i); t = 0; for(int i: a1) for(int j: a1) if(mapa[i][j] == f) t++; t /= 2; k = (3*n+3)/4; for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { if(mapa[i][j] != '?') cout << mapa[i][j]; else if(a1.find(i) != a1.end() && a1.find(j) != a1.end()) cout << s; else cout << f; } cout << '\n'; } }