#include <bits/stdc++.h> using namespace std; pair<bool, char> monocolor(const array<int, 26>& a) { char color = 'A' - 1; for (int c = 0; c < 26; ++c) { if (a[c] == 0) continue; if (color >= 'A') return {false, color}; color = 'A' + c; } return {color != 'A' - 1, color}; } pair<list<pair<int, array<int, 26>>>::iterator, char> find_monocolor(list<pair<int, array<int, 26>>>& xs) { auto it = xs.begin(); while (it != xs.end()) { auto [i, row] = *it; auto [is_monocolor, color] = monocolor(row); if (is_monocolor) return {it, color}; ++it; } return {it, 'A' - 1}; } int main() { std::ios::sync_with_stdio(false); cin.tie(NULL); int n, m; cin >> n >> m; vector<vector<char>> plansza(n, vector<char>(m)); for (int i = 0; i < n; ++i) { string row; cin >> row; for (int j = 0; j < m; ++j) { plansza[i][j] = row[j]; } } list<pair<int, array<int, 26>>> rows; list<pair<int, array<int, 26>>> cols; for (int i = 0; i < n; ++i) { array<int, 26> row = {}; for (int j = 0; j < m; ++j) { ++row[plansza[i][j] - 'A']; } rows.push_back({i, row}); } for (int j = 0; j < m; ++j) { array<int, 26> col = {}; for (int i = 0; i < n; ++i) { ++col[plansza[i][j] - 'A']; } cols.push_back({j, col}); } stack<pair<pair<char, int>, char>> res; for (int step = 0; step < n + m; ++step) { auto it = rows.begin(); while (it != rows.end()) { auto [is_monocolor, color] = monocolor(it->second); if (is_monocolor) { for (auto& [j, col] : cols) --col[color - 'A']; res.push({{'R', it->first + 1}, color}); it = rows.erase(it); } else { ++it; } } it = cols.begin(); while (it != cols.end()) { auto [is_monocolor, color] = monocolor(it->second); if (is_monocolor) { for (auto& [i, row] : rows) --row[color - 'A']; res.push({{'K', it->first + 1}, color}); it = cols.erase(it); } else { ++it; } } } cout << res.size() << "\n"; while (!res.empty()) { auto [xy, color] = res.top(); res.pop(); cout << xy.first << " " << xy.second << " " << color << "\n"; } 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 | #include <bits/stdc++.h> using namespace std; pair<bool, char> monocolor(const array<int, 26>& a) { char color = 'A' - 1; for (int c = 0; c < 26; ++c) { if (a[c] == 0) continue; if (color >= 'A') return {false, color}; color = 'A' + c; } return {color != 'A' - 1, color}; } pair<list<pair<int, array<int, 26>>>::iterator, char> find_monocolor(list<pair<int, array<int, 26>>>& xs) { auto it = xs.begin(); while (it != xs.end()) { auto [i, row] = *it; auto [is_monocolor, color] = monocolor(row); if (is_monocolor) return {it, color}; ++it; } return {it, 'A' - 1}; } int main() { std::ios::sync_with_stdio(false); cin.tie(NULL); int n, m; cin >> n >> m; vector<vector<char>> plansza(n, vector<char>(m)); for (int i = 0; i < n; ++i) { string row; cin >> row; for (int j = 0; j < m; ++j) { plansza[i][j] = row[j]; } } list<pair<int, array<int, 26>>> rows; list<pair<int, array<int, 26>>> cols; for (int i = 0; i < n; ++i) { array<int, 26> row = {}; for (int j = 0; j < m; ++j) { ++row[plansza[i][j] - 'A']; } rows.push_back({i, row}); } for (int j = 0; j < m; ++j) { array<int, 26> col = {}; for (int i = 0; i < n; ++i) { ++col[plansza[i][j] - 'A']; } cols.push_back({j, col}); } stack<pair<pair<char, int>, char>> res; for (int step = 0; step < n + m; ++step) { auto it = rows.begin(); while (it != rows.end()) { auto [is_monocolor, color] = monocolor(it->second); if (is_monocolor) { for (auto& [j, col] : cols) --col[color - 'A']; res.push({{'R', it->first + 1}, color}); it = rows.erase(it); } else { ++it; } } it = cols.begin(); while (it != cols.end()) { auto [is_monocolor, color] = monocolor(it->second); if (is_monocolor) { for (auto& [i, row] : rows) --row[color - 'A']; res.push({{'K', it->first + 1}, color}); it = cols.erase(it); } else { ++it; } } } cout << res.size() << "\n"; while (!res.empty()) { auto [xy, color] = res.top(); res.pop(); cout << xy.first << " " << xy.second << " " << color << "\n"; } return 0; } |