#include <bits/stdc++.h>
using namespace std;
char tab[2007][2007];
map<char, int> col[2007];
map<char, int> row[2007];
queue<pair<pair<char, int>, char>> ready;
stack<pair<pair<char, int>, char>> done;
void print_tab(int n, int m) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cout << tab[i][j];
}
cout << "\n";
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
char c;
cin >> c;
tab[i][j] = c;
row[i][c]++;
col[j][c]++;
}
}
for (int i = 1; i <= n; i++) {
// cout << "row " << i << " size " << row[i].size() << "\n";
if (row[i].size() == 1) {
ready.push({{'R', i}, row[i].begin()->first});
// cout << "row " << i << " ready\n";
}
}
for (int j = 1; j <= m; j++) {
// cout << "col " << j << " size " << col[j].size() << "\n";
if (col[j].size() == 1) {
ready.push({{'K', j}, col[j].begin()->first});
// cout << "column " << j << " ready\n";
}
}
// return 0;
while (!ready.empty()) {
auto [op, k] = ready.front().first;
// cout << "delete " << ready.front().first.first << " " << ready.front().first.second << " " << ready.front().second << "\n";
done.push(ready.front());
ready.pop();
if (op == 'R') {
for (int j = 1; j <= m; j++) {
char c = tab[k][j];
if (c != '0') {
col[j][c]--;
if (col[j][c] == 0) {
col[j].erase(c);
if (col[j].size() == 1) {
// cout << "column " << j << " ready\n";
ready.push({{'K', j}, col[j].begin()->first});
}
}
}
tab[k][j] = '0';
}
}
else {
for (int i = 1; i <= n; i++) {
char c = tab[i][k];
if (c != '0') {
row[i][c]--;
if (row[i][c] == 0) {
row[i].erase(c);
if (row[i].size() == 1) {
// cout << "row " << i << " ready\n";
ready.push({{'R', i}, row[i].begin()->first});
}
}
}
tab[i][k] = '0';
}
}
// print_tab(n, m);
}
cout << done.size() << "\n";
while (!done.empty()) {
cout << done.top().first.first << " " << done.top().first.second << " " << done.top().second << "\n";
done.pop();
}
}
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 | #include <bits/stdc++.h> using namespace std; char tab[2007][2007]; map<char, int> col[2007]; map<char, int> row[2007]; queue<pair<pair<char, int>, char>> ready; stack<pair<pair<char, int>, char>> done; void print_tab(int n, int m) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cout << tab[i][j]; } cout << "\n"; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { char c; cin >> c; tab[i][j] = c; row[i][c]++; col[j][c]++; } } for (int i = 1; i <= n; i++) { // cout << "row " << i << " size " << row[i].size() << "\n"; if (row[i].size() == 1) { ready.push({{'R', i}, row[i].begin()->first}); // cout << "row " << i << " ready\n"; } } for (int j = 1; j <= m; j++) { // cout << "col " << j << " size " << col[j].size() << "\n"; if (col[j].size() == 1) { ready.push({{'K', j}, col[j].begin()->first}); // cout << "column " << j << " ready\n"; } } // return 0; while (!ready.empty()) { auto [op, k] = ready.front().first; // cout << "delete " << ready.front().first.first << " " << ready.front().first.second << " " << ready.front().second << "\n"; done.push(ready.front()); ready.pop(); if (op == 'R') { for (int j = 1; j <= m; j++) { char c = tab[k][j]; if (c != '0') { col[j][c]--; if (col[j][c] == 0) { col[j].erase(c); if (col[j].size() == 1) { // cout << "column " << j << " ready\n"; ready.push({{'K', j}, col[j].begin()->first}); } } } tab[k][j] = '0'; } } else { for (int i = 1; i <= n; i++) { char c = tab[i][k]; if (c != '0') { row[i][c]--; if (row[i][c] == 0) { row[i].erase(c); if (row[i].size() == 1) { // cout << "row " << i << " ready\n"; ready.push({{'R', i}, row[i].begin()->first}); } } } tab[i][k] = '0'; } } // print_tab(n, m); } cout << done.size() << "\n"; while (!done.empty()) { cout << done.top().first.first << " " << done.top().first.second << " " << done.top().second << "\n"; done.pop(); } } |
English