#include <bits/stdc++.h>
#define MAX_N 2007
#define MAX_L 30
using namespace std;
int lr[MAX_N][MAX_L];
int ud[MAX_N][MAX_L];
int lrIlosc[MAX_N];
int udIlosc[MAX_N];
bool usedlr[MAX_N];
bool usedud[MAX_N];
struct kolor{
bool rzad; //0 - lr, 1 - ud
int nr;
char color;
};
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m;
cin >> n >> m;
string gra[n];
for(int i = 0; i < n; i++) cin >> gra[i];
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
lr[i][gra[i][j] - 'A']++;
}
}
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
ud[i][gra[j][i] - 'A']++;
}
}
vector<kolor> wynik;
queue<kolor> q;
for(int i = 0; i < m; i++){
for(int j = 0; j < MAX_L; j++){
if(ud[i][j]) udIlosc[i]++;
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < MAX_L; j++){
if(lr[i][j]) lrIlosc[i]++;
}
}
char k;
bool ok = 0;
for(int i = 0; i < n; i++){
if(lrIlosc[i] == 1){
q.push({0, i, gra[i][0]});
}
}
for(int i = 0; i < m; i++){
if(udIlosc[i] == 1){
q.push({1, i, gra[0][i]});
}
}
bool t;
int w;
while(!q.empty()){
t = q.front().rzad;
w = q.front().nr;
k = q.front().color;
q.pop();
if(!t){
if(lrIlosc[w] == 0) continue;
wynik.push_back({0, w+1, k});
lrIlosc[w] = 0;
usedlr[w] = 1;
for(int j = 0; j < m; j++){
if(!usedud[j]){
ud[j][gra[w][j] - 'A']--;
if(!ud[j][gra[w][j] - 'A']){
udIlosc[j]--;
if(udIlosc[j] == 1){
for(int l = 0; l < MAX_L; l++){
if(ud[j][l]){
k = char('A' + l);
break;
}
}
q.push({1, j, k});
}
}
}
}
}else{
if(udIlosc[w] == 0) continue;
wynik.push_back({1, w+1, k});
udIlosc[w] = 0;
usedud[w] = 1;
for(int j = 0; j < n; j++){
if(!usedlr[j]){
lr[j][gra[j][w] - 'A']--;
if(!lr[j][gra[j][w] - 'A']){
lrIlosc[j]--;
if(lrIlosc[j] == 1){
for(int l = 0; l < MAX_L; l++){
if(lr[j][l]){
k = char('A' + l);
break;
}
}
q.push({0, j, k});
}
}
}
}
}
}
reverse(wynik.begin(), wynik.end());
cout << wynik.size() << '\n';
for(auto& i : wynik){
if(!i.rzad) cout << "R ";
else cout << "K ";
cout << i.nr << " " << i.color << '\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 114 115 116 117 118 119 120 121 122 | #include <bits/stdc++.h> #define MAX_N 2007 #define MAX_L 30 using namespace std; int lr[MAX_N][MAX_L]; int ud[MAX_N][MAX_L]; int lrIlosc[MAX_N]; int udIlosc[MAX_N]; bool usedlr[MAX_N]; bool usedud[MAX_N]; struct kolor{ bool rzad; //0 - lr, 1 - ud int nr; char color; }; int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, m; cin >> n >> m; string gra[n]; for(int i = 0; i < n; i++) cin >> gra[i]; for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ lr[i][gra[i][j] - 'A']++; } } for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ ud[i][gra[j][i] - 'A']++; } } vector<kolor> wynik; queue<kolor> q; for(int i = 0; i < m; i++){ for(int j = 0; j < MAX_L; j++){ if(ud[i][j]) udIlosc[i]++; } } for(int i = 0; i < n; i++){ for(int j = 0; j < MAX_L; j++){ if(lr[i][j]) lrIlosc[i]++; } } char k; bool ok = 0; for(int i = 0; i < n; i++){ if(lrIlosc[i] == 1){ q.push({0, i, gra[i][0]}); } } for(int i = 0; i < m; i++){ if(udIlosc[i] == 1){ q.push({1, i, gra[0][i]}); } } bool t; int w; while(!q.empty()){ t = q.front().rzad; w = q.front().nr; k = q.front().color; q.pop(); if(!t){ if(lrIlosc[w] == 0) continue; wynik.push_back({0, w+1, k}); lrIlosc[w] = 0; usedlr[w] = 1; for(int j = 0; j < m; j++){ if(!usedud[j]){ ud[j][gra[w][j] - 'A']--; if(!ud[j][gra[w][j] - 'A']){ udIlosc[j]--; if(udIlosc[j] == 1){ for(int l = 0; l < MAX_L; l++){ if(ud[j][l]){ k = char('A' + l); break; } } q.push({1, j, k}); } } } } }else{ if(udIlosc[w] == 0) continue; wynik.push_back({1, w+1, k}); udIlosc[w] = 0; usedud[w] = 1; for(int j = 0; j < n; j++){ if(!usedlr[j]){ lr[j][gra[j][w] - 'A']--; if(!lr[j][gra[j][w] - 'A']){ lrIlosc[j]--; if(lrIlosc[j] == 1){ for(int l = 0; l < MAX_L; l++){ if(lr[j][l]){ k = char('A' + l); break; } } q.push({0, j, k}); } } } } } } reverse(wynik.begin(), wynik.end()); cout << wynik.size() << '\n'; for(auto& i : wynik){ if(!i.rzad) cout << "R "; else cout << "K "; cout << i.nr << " " << i.color << '\n'; } } |
English