#include #include using namespace std; int cnt[26]; int table[26][26]; void topo(int k) { if(cnt[k] != 0) return; --cnt[k]; for(int i = 0; i < 26; ++i) { if(table[k][i]) { --cnt[i]; topo(i); } } } bool check() { memset(cnt, 0, sizeof(cnt)); for (int i = 0; i < 26; ++i) for (int j = 0; j < 26; ++j){ if (table[i][j]) ++cnt[j]; } for(int i = 0; i < 26; ++i) { topo(i); } for(int i = 0; i < 26; ++i) { if(cnt[i] > 0) return false; } return true; } int h, w; char input[50][50]; int main() { int n_cases; cin >> n_cases; while(n_cases--){ cin >> h >> w; set materials; memset(table, 0, sizeof(table)); for(int y = 0; y < h; ++y) for(int x = 0; x < w; ++x){ cin >> input[x][y]; if (input[x][y] != '.') materials.insert(input[x][y]); } int min_x[26]; int max_x[26]; int min_y[26]; int max_y[26]; for (int i = 0; i < 26; ++i){ min_x[i] = 100; max_x[i] = -1; min_y[i] = 100; max_y[i] = -1; } for (int x = 0; x < w; ++x){ for (int y = 0; y < h; ++y){ if (input[x][y] == '.')continue; int i = input[x][y] - 'A'; min_x[i] = min(min_x[i], x); min_y[i] = min(min_y[i], y); max_x[i] = max(max_x[i], x); max_y[i] = max(max_y[i], y); } } bool ok = true; for (set::iterator it = materials.begin(); it != materials.end() and ok; ++it){ char i = *it - 'A'; for (int x = min_x[i]; x <= max_x[i] and ok; ++x){ for (int y = min_y[i]; y <= max_y[i] and ok; ++y){ if (input[x][y] == '.'){ ok = false; break; } char j = input[x][y] - 'A'; if (i != j){ table[j][i] = 1; } } } } /* for (int i = 0; i < 26; ++i){ cout << min_x[i] << "," << max_x[i] << "," << min_y[i] << "," << max_y[i] << endl; } cout << ok << endl; for (int i = 0; i < 26; ++i){ for (int j = 0; j < 26; ++j){ if (j != 0) cout << " "; cout << table[i][j]; } cout << endl; } */ if(ok && check()) { cout << "SAFE" << endl; } else { cout << "SUSPICIOUS" << endl; } } }