#include <bits/stdc++.h> #define MAX_N 2007 #define mp make_pair typedef long long ll; using namespace std; int n, m; queue<pair<int, char>> nocolor; stack<pair<int, char>> res; set<char> ccounter[MAX_N], rcounter[MAX_N]; int cvec[MAX_N][100], rvec[MAX_N][100]; char plain[MAX_N][MAX_N]; char c; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> c; plain[i][j] = c; cvec[j][c]++; if (cvec[j][c] == 1) { ccounter[j].insert(c); } rvec[i][c]++; if (rvec[i][c] == 1) { rcounter[i].insert(c); } } } for (int i = 1; i <= n; i++) { if (rcounter[i].size() == 1) { nocolor.push(mp(i, *(rcounter[i].begin()))); } } for (int i = 1; i <= m; i++) { if (ccounter[i].size() == 1) { nocolor.push(mp(-i, *(ccounter[i].begin()))); } } while(!nocolor.empty()) { auto cur = nocolor.front(); nocolor.pop(); bool is_column = (cur.first < 0); res.push(cur); int temp = abs(cur.first); if (is_column) { for (int i = 1; i <= n; i++) { c = plain[i][temp]; rvec[i][c]--; // cout << "r " << i << " " << c << " " << rvec[i][c] << "\n"; if (rvec[i][c] == 0) { rcounter[i].erase(c); if (rcounter[i].size() == 1) { nocolor.push(mp(i, *(rcounter[i].begin()))); rcounter[i].clear(); } } } } else { for (int i = 1; i <= m; i++) { c = plain[temp][i]; cvec[i][c]--; // cout << "c " << i << " " << c << " " << cvec[i][c] << "\n"; if (cvec[i][c] == 0) { ccounter[i].erase(c); if (ccounter[i].size() == 1) { nocolor.push(mp(-i, *(ccounter[i].begin()))); ccounter[i].clear(); } } } } } cout << res.size() << "\n"; while(!res.empty()) { auto cur = res.top(); res.pop(); bool is_column = (cur.first < 0); string ck = is_column ? "K " : "R "; cout << ck << abs(cur.first) << " " << cur.second << "\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 | #include <bits/stdc++.h> #define MAX_N 2007 #define mp make_pair typedef long long ll; using namespace std; int n, m; queue<pair<int, char>> nocolor; stack<pair<int, char>> res; set<char> ccounter[MAX_N], rcounter[MAX_N]; int cvec[MAX_N][100], rvec[MAX_N][100]; char plain[MAX_N][MAX_N]; char c; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> c; plain[i][j] = c; cvec[j][c]++; if (cvec[j][c] == 1) { ccounter[j].insert(c); } rvec[i][c]++; if (rvec[i][c] == 1) { rcounter[i].insert(c); } } } for (int i = 1; i <= n; i++) { if (rcounter[i].size() == 1) { nocolor.push(mp(i, *(rcounter[i].begin()))); } } for (int i = 1; i <= m; i++) { if (ccounter[i].size() == 1) { nocolor.push(mp(-i, *(ccounter[i].begin()))); } } while(!nocolor.empty()) { auto cur = nocolor.front(); nocolor.pop(); bool is_column = (cur.first < 0); res.push(cur); int temp = abs(cur.first); if (is_column) { for (int i = 1; i <= n; i++) { c = plain[i][temp]; rvec[i][c]--; // cout << "r " << i << " " << c << " " << rvec[i][c] << "\n"; if (rvec[i][c] == 0) { rcounter[i].erase(c); if (rcounter[i].size() == 1) { nocolor.push(mp(i, *(rcounter[i].begin()))); rcounter[i].clear(); } } } } else { for (int i = 1; i <= m; i++) { c = plain[temp][i]; cvec[i][c]--; // cout << "c " << i << " " << c << " " << cvec[i][c] << "\n"; if (cvec[i][c] == 0) { ccounter[i].erase(c); if (ccounter[i].size() == 1) { nocolor.push(mp(-i, *(ccounter[i].begin()))); ccounter[i].clear(); } } } } } cout << res.size() << "\n"; while(!res.empty()) { auto cur = res.top(); res.pop(); bool is_column = (cur.first < 0); string ck = is_column ? "K " : "R "; cout << ck << abs(cur.first) << " " << cur.second << "\n"; } } |