#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]; void tr(char F, char S) { memset(G, 0, sizeof(G)); memset(G2, 0, sizeof(G2)); memset(is_independent, 0, sizeof(is_independent)); memset(cnt, 0, sizeof(cnt)); for(int i = 0; i < N; i++) { for(int j = 0; j < N; 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); } } } 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"; } exit(0); } } } } int main() { cin >> N; for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { cin >> C[i][j]; } } 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; } tr('F', 'S'); tr('S', 'F'); assert(false); return 0; }