#include using namespace std; const int N_MAX = 24; int N; int G[N_MAX + 5]; int G2[N_MAX + 5]; char C[N_MAX + 5][N_MAX + 5]; bool is_independent[1 << N_MAX]; int cnt[1 << N_MAX]; int main() { cin >> N; for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { cin >> C[i][j]; if(C[i][j] == 'S' && i < j) { G[i] ^= 1 << j; G[j] ^= 1 << i; } if(C[i][j] == 'F' && i < j) { G2[i] ^= (1 << j); G2[j] ^= (1 << i); } } } if(N <= 7) { for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { if(C[i][j] == '?' && i != j) { C[i][j] = 'F'; } cout << C[i][j]; } cout << "\n"; } return 0; } is_independent[0] = true; for(int conf = 1; conf < (1 << N); conf++) { int p = __builtin_ctz(conf); is_independent[conf] = is_independent[conf ^ (1 << p)] && (G[p] & conf) == 0; cnt[conf] = cnt[conf ^ (1 << p)] + __builtin_popcount(G2[p] & conf); } int n34 = (N * 3 - 1) / 4 + 1; int lower = N - n34 - 1; int upper = n34 / 2; for(int conf = 1; conf < (1 << N); conf++) { if(__builtin_popcount(conf) >= lower && __builtin_popcount(conf) <= upper) { int comp = (1 << N) - 1 - conf; if(is_independent[conf] && is_independent[comp] && cnt[conf] + cnt[comp] == cnt[(1 << N) - 1]) { auto fil = [&](int conf_a, int conf_b, char c) { for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { if(i == j) { continue; } if((conf_a & (1 << i)) && (conf_b & (1 << j)) ) { C[i][j] = c; } } } }; fil(conf, conf, 'F'); fil(comp, comp, 'F'); fil(conf, comp, 'S'); fil(comp, conf, 'S'); for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { cout << C[i][j]; } cout << "\n"; } return 0; } } } return 0; }