#include #define x first #define y second using namespace std; using ll=long long; using pii=pair; using vi=vector; using vl=vector; #define pb push_back #define PB push_back #define X first #define Y second #define all(a) begin(a),end(a) const int N=300010,MOD=1e9+7; const char en='\n'; const ll LLINF=1ll<<60; int maxp(vector um) { int n=um.size(); assert((int)um[0].size()==n); vi im(n); for (int i=0;i pr; for (int i=0;i<24;++i) pr[i]=0; vector> v(1<>j)&1) && !((b>>j)&1)) { v[b|(1< um) { int r1=maxp(um); //cout< v[2]; int flip = 0; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for(int i = 0;i < n;i++) { for(int j = 0;j < n;j++) { char c; cin >> c; if(i < j && c != '?' && c != '.') { v[c == 'F'].PB({i, j}); } } } if((int)v[0].size() < (int)v[1].size()) { flip = 1; swap(v[0], v[1]); } int lo = n - ((3 * n + 3) / 4 - (int)v[1].size()) / 2, hi = (3 * n + 3) / 4 + 1; for(int msk = 0;msk < (1 << n);msk++) { if(__builtin_popcount(msk) < lo || __builtin_popcount(msk) > hi) continue; int los = 0; for(auto tmp : v[0]) if((!!(msk & (1 << tmp.X))) != (!!(msk & (1 << tmp.Y)))) los = 1; if(los) continue; vector < vi > ans(n, vi(n, 0)); for(int i = 0;i < n;i++) { for(int j = 0;j < n;j++) { if(i != j) ans[i][j] = (!!(msk & (1 << i))) != (!!(msk & (1 << j))); } } for(auto tmp : v[0]) ans[tmp.X][tmp.Y] = 0, ans[tmp.Y][tmp.X] = 0; for(auto tmp : v[1]) ans[tmp.X][tmp.Y] = 1, ans[tmp.Y][tmp.X] = 1; if(1) { for(int i = 0;i < n;i++) { for(int j = 0;j < n;j++) { if(i == j) cout << "."; else cout << ((ans[i][j] ^ flip) ? "F" : "S"); } cout << "\n"; } } return 0; } }