#include <bits/stdc++.h> #include <iterator> using namespace std; int n, m; struct cumsum { int idx, col[26]; }; const int UNKNOWN = -1; bool is_transposed = false; void transpose(vector<cumsum> &rows, vector<cumsum> &cols) { swap(rows, cols); swap(n, m); is_transposed = !is_transposed; } struct op { char dir, color; int num; }; stack<op> ops; void add_op(int num, char color) { ops.push({is_transposed ? 'K' : 'R', static_cast<char>(color + 'A'), num}); } vector<pair<int, int>> find_mono_rows(vector<cumsum> &rows) { vector<pair<int, int>> res; for (int i = 0; i < n; ++i) { int col = UNKNOWN; bool is_mono = true; for (int c = 0; c < 26; ++c) { if (rows[i].col[c] > 0) { if (col != UNKNOWN) { is_mono = false; break; } col = c; } } if (is_mono && col != UNKNOWN) res.push_back({i, col}); } return res; } void unpaint_rows(const vector<pair<int, int>> &mono, const vector<cumsum> &rows, vector<cumsum> &cols) { for (auto [row, col] : mono) { add_op(rows[row].idx, col); for (int j = 0; j < m; ++j) --cols[j].col[col]; } } void remove_rows(const vector<pair<int, int>> &mono, vector<cumsum> &rows) { vector<cumsum> res; int j = 0; for (int i = 0; i < n; ++i) { if (j < mono.size() && i == mono[j].first) ++j; else res.push_back(rows[i]); } rows = res; n = rows.size(); } void undo(vector<cumsum> &rows, vector<cumsum> &cols) { if (rows.empty() || cols.empty()) return; const vector<pair<int, int>> mono = find_mono_rows(rows); unpaint_rows(mono, rows, cols); remove_rows(mono, rows); transpose(rows, cols); return undo(rows, cols); } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; vector<string> board(n); for (string &row : board) cin >> row; vector<cumsum> rows(n), cols(m); for (int i = 0; i < n; ++i) rows[i].idx = i; for (int j = 0; j < m; ++j) cols[j].idx = j; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) { ++rows[i].col[board[i][j] - 'A']; ++cols[j].col[board[i][j] - 'A']; } undo(rows, cols); cout << ops.size() << '\n'; while (!ops.empty()) { auto [dir, col, num] = ops.top(); ops.pop(); cout << dir << ' ' << num + 1 << ' ' << col << '\n'; } }
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 | #include <bits/stdc++.h> #include <iterator> using namespace std; int n, m; struct cumsum { int idx, col[26]; }; const int UNKNOWN = -1; bool is_transposed = false; void transpose(vector<cumsum> &rows, vector<cumsum> &cols) { swap(rows, cols); swap(n, m); is_transposed = !is_transposed; } struct op { char dir, color; int num; }; stack<op> ops; void add_op(int num, char color) { ops.push({is_transposed ? 'K' : 'R', static_cast<char>(color + 'A'), num}); } vector<pair<int, int>> find_mono_rows(vector<cumsum> &rows) { vector<pair<int, int>> res; for (int i = 0; i < n; ++i) { int col = UNKNOWN; bool is_mono = true; for (int c = 0; c < 26; ++c) { if (rows[i].col[c] > 0) { if (col != UNKNOWN) { is_mono = false; break; } col = c; } } if (is_mono && col != UNKNOWN) res.push_back({i, col}); } return res; } void unpaint_rows(const vector<pair<int, int>> &mono, const vector<cumsum> &rows, vector<cumsum> &cols) { for (auto [row, col] : mono) { add_op(rows[row].idx, col); for (int j = 0; j < m; ++j) --cols[j].col[col]; } } void remove_rows(const vector<pair<int, int>> &mono, vector<cumsum> &rows) { vector<cumsum> res; int j = 0; for (int i = 0; i < n; ++i) { if (j < mono.size() && i == mono[j].first) ++j; else res.push_back(rows[i]); } rows = res; n = rows.size(); } void undo(vector<cumsum> &rows, vector<cumsum> &cols) { if (rows.empty() || cols.empty()) return; const vector<pair<int, int>> mono = find_mono_rows(rows); unpaint_rows(mono, rows, cols); remove_rows(mono, rows); transpose(rows, cols); return undo(rows, cols); } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; vector<string> board(n); for (string &row : board) cin >> row; vector<cumsum> rows(n), cols(m); for (int i = 0; i < n; ++i) rows[i].idx = i; for (int j = 0; j < m; ++j) cols[j].idx = j; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) { ++rows[i].col[board[i][j] - 'A']; ++cols[j].col[board[i][j] - 'A']; } undo(rows, cols); cout << ops.size() << '\n'; while (!ops.empty()) { auto [dir, col, num] = ops.top(); ops.pop(); cout << dir << ' ' << num + 1 << ' ' << col << '\n'; } } |