#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'; } } |