// LAM: Łamigłówka [C] | 2024-03-14 | Solution by dkgl // https://sio2.mimuw.edu.pl/c/pa-2024-1/p/lam/ #include <bits/stdc++.h> using namespace std; struct ColorCount { private: string values; array<int, 26> count; int different_colors = 0; inline void reset(int n) { values = string(n, ' '); for (int i = 0; i < 26; ++i) count[i] = 0; different_colors = 0; } public: ColorCount(int n) { reset(n); }; void paint(int i, char c) { if (count[c-'A']++ == 0) ++different_colors; values[i] = c; }; void unpaint(int i) { char &c = values[i]; if (c == ' ') return; if (--count[c-'A'] == 0) --different_colors; c = ' '; } inline bool is_single_color() const { return different_colors == 1; } inline char get_single_color() const { for (char c = 'A'; c <= 'Z'; ++c) { if (count[c-'A'] != 0) return c; } return ' '; } inline void clear() { reset(values.size()); } }; #define Type char const Type TYPE_ROW = 'R'; const Type TYPE_COLUMN = 'K'; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; vector<ColorCount> rows(n, ColorCount(m)); vector<ColorCount> columns(m, ColorCount(n)); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { char color; cin >> color; rows[i].paint(j, color); columns[j].paint(i, color); } } stack<pair<int, Type>> clear_queue; for (int i = 0; i < n; ++i) { if (rows[i].is_single_color()) { clear_queue.push({ i, TYPE_ROW }); } } for (int j = 0; j < m; ++j) { if (columns[j].is_single_color()) { clear_queue.push({ j, TYPE_COLUMN }); } } vector<string> result; while (!clear_queue.empty()) { auto [index, type] = clear_queue.top(); clear_queue.pop(); auto &colors = (type == TYPE_ROW ? rows : columns)[index]; if (!colors.is_single_color()) continue; char color = colors.get_single_color(); colors.clear(); result.push_back(string() + type + " " + to_string(index + 1) + ' ' + color); if (type == TYPE_ROW) { for (int j = 0; j < m; ++j) { columns[j].unpaint(index); if (columns[j].is_single_color()) clear_queue.push({ j, TYPE_COLUMN }); } } else { for (int i = 0; i < n; ++i) { rows[i].unpaint(index); if (rows[i].is_single_color()) clear_queue.push({ i, TYPE_ROW }); } } } reverse(result.begin(), result.end()); cout << result.size() << '\n'; for (auto &row: result) cout << row << '\n'; cout.flush(); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | // LAM: Łamigłówka [C] | 2024-03-14 | Solution by dkgl // https://sio2.mimuw.edu.pl/c/pa-2024-1/p/lam/ #include <bits/stdc++.h> using namespace std; struct ColorCount { private: string values; array<int, 26> count; int different_colors = 0; inline void reset(int n) { values = string(n, ' '); for (int i = 0; i < 26; ++i) count[i] = 0; different_colors = 0; } public: ColorCount(int n) { reset(n); }; void paint(int i, char c) { if (count[c-'A']++ == 0) ++different_colors; values[i] = c; }; void unpaint(int i) { char &c = values[i]; if (c == ' ') return; if (--count[c-'A'] == 0) --different_colors; c = ' '; } inline bool is_single_color() const { return different_colors == 1; } inline char get_single_color() const { for (char c = 'A'; c <= 'Z'; ++c) { if (count[c-'A'] != 0) return c; } return ' '; } inline void clear() { reset(values.size()); } }; #define Type char const Type TYPE_ROW = 'R'; const Type TYPE_COLUMN = 'K'; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; vector<ColorCount> rows(n, ColorCount(m)); vector<ColorCount> columns(m, ColorCount(n)); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { char color; cin >> color; rows[i].paint(j, color); columns[j].paint(i, color); } } stack<pair<int, Type>> clear_queue; for (int i = 0; i < n; ++i) { if (rows[i].is_single_color()) { clear_queue.push({ i, TYPE_ROW }); } } for (int j = 0; j < m; ++j) { if (columns[j].is_single_color()) { clear_queue.push({ j, TYPE_COLUMN }); } } vector<string> result; while (!clear_queue.empty()) { auto [index, type] = clear_queue.top(); clear_queue.pop(); auto &colors = (type == TYPE_ROW ? rows : columns)[index]; if (!colors.is_single_color()) continue; char color = colors.get_single_color(); colors.clear(); result.push_back(string() + type + " " + to_string(index + 1) + ' ' + color); if (type == TYPE_ROW) { for (int j = 0; j < m; ++j) { columns[j].unpaint(index); if (columns[j].is_single_color()) clear_queue.push({ j, TYPE_COLUMN }); } } else { for (int i = 0; i < n; ++i) { rows[i].unpaint(index); if (rows[i].is_single_color()) clear_queue.push({ i, TYPE_ROW }); } } } reverse(result.begin(), result.end()); cout << result.size() << '\n'; for (auto &row: result) cout << row << '\n'; cout.flush(); return 0; } |