#include <bits/stdc++.h> using namespace std; const int MAX=2005; char tab[MAX][MAX]; int kolumny[MAX][27]; int rzedy[MAX][27]; int niezeror[MAX]; int niezerok[MAX]; queue <pair<char, int>> qu; stack <pair<char, pair<int, char>>> ans; 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++) { cin >>tab[i][j]; if(kolumny[j][tab[i][j]-'A'+1]==0) niezerok[j]++; kolumny[j][tab[i][j]-'A'+1]++; if(rzedy[i][tab[i][j]-'A'+1]==0) niezeror[i]++; rzedy[i][tab[i][j]-'A'+1]++; } } for(int i=1; i<=n; i++) { if(niezeror[i]==1) qu.push(make_pair('R', i)); } for(int i=1; i<=m; i++) { if(niezerok[i]==1) qu.push(make_pair('K', i)); } while(!qu.empty()) { char a=qu.front().first, temp; int x=qu.front().second; qu.pop(); if(a=='K') { if(niezerok[x]==0) continue; niezerok[x]=0; for(int i=1; i<=n; i++) { if(tab[i][x]!='-') { temp=tab[i][x]; rzedy[i][tab[i][x]-'A'+1]--; if(rzedy[i][tab[i][x]-'A'+1]==0) niezeror[i]--; if(niezeror[i]==1) { qu.push(make_pair('R', i)); } tab[i][x]='-'; } } ans.push(make_pair('K', make_pair(x, temp))); } else { if(niezeror[x]==0) continue; niezeror[x]=0; for(int i=1; i<=m; i++) { if(tab[x][i]!='-') { temp=tab[x][i]; kolumny[i][tab[x][i]-'A'+1]--; if(kolumny[i][tab[x][i]-'A'+1]==0) niezerok[i]--; if(niezerok[i]==1) { qu.push(make_pair('K', i)); } tab[x][i]='-'; } } ans.push(make_pair('R', make_pair(x, temp))); } } while(!qu.empty()) { cout <<qu.front().first <<" " <<qu.front().second <<"\n"; qu.pop(); } cout <<ans.size() <<"\n"; while(!ans.empty()) { cout <<ans.top().first <<" " <<ans.top().second.first <<" " <<ans.top().second.second <<"\n"; ans.pop(); } 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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | #include <bits/stdc++.h> using namespace std; const int MAX=2005; char tab[MAX][MAX]; int kolumny[MAX][27]; int rzedy[MAX][27]; int niezeror[MAX]; int niezerok[MAX]; queue <pair<char, int>> qu; stack <pair<char, pair<int, char>>> ans; 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++) { cin >>tab[i][j]; if(kolumny[j][tab[i][j]-'A'+1]==0) niezerok[j]++; kolumny[j][tab[i][j]-'A'+1]++; if(rzedy[i][tab[i][j]-'A'+1]==0) niezeror[i]++; rzedy[i][tab[i][j]-'A'+1]++; } } for(int i=1; i<=n; i++) { if(niezeror[i]==1) qu.push(make_pair('R', i)); } for(int i=1; i<=m; i++) { if(niezerok[i]==1) qu.push(make_pair('K', i)); } while(!qu.empty()) { char a=qu.front().first, temp; int x=qu.front().second; qu.pop(); if(a=='K') { if(niezerok[x]==0) continue; niezerok[x]=0; for(int i=1; i<=n; i++) { if(tab[i][x]!='-') { temp=tab[i][x]; rzedy[i][tab[i][x]-'A'+1]--; if(rzedy[i][tab[i][x]-'A'+1]==0) niezeror[i]--; if(niezeror[i]==1) { qu.push(make_pair('R', i)); } tab[i][x]='-'; } } ans.push(make_pair('K', make_pair(x, temp))); } else { if(niezeror[x]==0) continue; niezeror[x]=0; for(int i=1; i<=m; i++) { if(tab[x][i]!='-') { temp=tab[x][i]; kolumny[i][tab[x][i]-'A'+1]--; if(kolumny[i][tab[x][i]-'A'+1]==0) niezerok[i]--; if(niezerok[i]==1) { qu.push(make_pair('K', i)); } tab[x][i]='-'; } } ans.push(make_pair('R', make_pair(x, temp))); } } while(!qu.empty()) { cout <<qu.front().first <<" " <<qu.front().second <<"\n"; qu.pop(); } cout <<ans.size() <<"\n"; while(!ans.empty()) { cout <<ans.top().first <<" " <<ans.top().second.first <<" " <<ans.top().second.second <<"\n"; ans.pop(); } return 0; } |