#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
int n, m;
cin >> n >> m;
vector<string> P(n);
vector<map<char, int>> K0(m);
vector<map<char, int>> W0(n);
for (int w = 0; w < n; ++w) {
cin >> P[w];
for (int k = 0; k < m; ++k) {
char z = P[w][k];
K0[k][z]++;
W0[w][z]++;
}
}
vector<int> K(m);
vector<int> W(n);
for (int i = 0; i < m; ++i) {
K[i] = i;
}
for (int i = 0; i < n; ++i) {
W[i] = i;
}
vector<string> ans;
while (!K.empty() || !W.empty()) {
vector<int> nextK;
for (int k : K) {
if (K0[k].size() > 1) {
nextK.push_back(k);
} else if (K0[k].size() == 1) {
char c = K0[k].begin()->first;
ans.push_back("K " + to_string(k + 1) + " " + string(1, c));
for (int w : W) {
if (P[w][k] == c) {
P[w][k] = '@';
W0[w][c]--;
if (W0[w][c] == 0) {
W0[w].erase(c);
}
}
}
}
}
K = nextK;
vector<int> nextW;
for (int w : W) {
if (W0[w].size() > 1) {
nextW.push_back(w);
} else if (W0[w].size() == 1) {
char c = W0[w].begin()->first;
ans.push_back("R " + to_string(w + 1) + " " + string(1, c));
for (int k : K) {
if (P[w][k] == c) {
P[w][k] = '@';
K0[k][c]--;
if (K0[k][c] == 0) {
K0[k].erase(c);
}
}
}
}
}
W = nextW;
}
cout << ans.size() << endl;
for (int i = ans.size() - 1; i >= 0; --i) {
cout << ans[i] << endl;
}
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 | #include <iostream> #include <vector> #include <map> using namespace std; int main() { ios_base::sync_with_stdio(0); int n, m; cin >> n >> m; vector<string> P(n); vector<map<char, int>> K0(m); vector<map<char, int>> W0(n); for (int w = 0; w < n; ++w) { cin >> P[w]; for (int k = 0; k < m; ++k) { char z = P[w][k]; K0[k][z]++; W0[w][z]++; } } vector<int> K(m); vector<int> W(n); for (int i = 0; i < m; ++i) { K[i] = i; } for (int i = 0; i < n; ++i) { W[i] = i; } vector<string> ans; while (!K.empty() || !W.empty()) { vector<int> nextK; for (int k : K) { if (K0[k].size() > 1) { nextK.push_back(k); } else if (K0[k].size() == 1) { char c = K0[k].begin()->first; ans.push_back("K " + to_string(k + 1) + " " + string(1, c)); for (int w : W) { if (P[w][k] == c) { P[w][k] = '@'; W0[w][c]--; if (W0[w][c] == 0) { W0[w].erase(c); } } } } } K = nextK; vector<int> nextW; for (int w : W) { if (W0[w].size() > 1) { nextW.push_back(w); } else if (W0[w].size() == 1) { char c = W0[w].begin()->first; ans.push_back("R " + to_string(w + 1) + " " + string(1, c)); for (int k : K) { if (P[w][k] == c) { P[w][k] = '@'; K0[k][c]--; if (K0[k][c] == 0) { K0[k].erase(c); } } } } } W = nextW; } cout << ans.size() << endl; for (int i = ans.size() - 1; i >= 0; --i) { cout << ans[i] << endl; } return 0; } |
English