#include<iostream> #include<map> #include<stack> #include<queue> using namespace std; stack<string> wypisy; int n,m; map<char, int> mapa[2010][2]; bool visited[2010][2]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin>>n>>m; char tab[n][m]; for(int i=0;i<n;i++) { string wejscie; cin>>wejscie; for(int j=0;j<wejscie.size();j++) { tab[i][j] = wejscie[j]; if(mapa[i][1].find(tab[i][j]) == mapa[i][1].end()) mapa[i][1][tab[i][j]] = 1; else mapa[i][1][tab[i][j]]++; if(mapa[j][0].find(tab[i][j]) == mapa[j][0].end()) mapa[j][0][tab[i][j]] = 1; else mapa[j][0][tab[i][j]]++; } } queue< pair<int, bool> > kolejka; for(int i=0;i<n;i++) { if(mapa[i][1].size() == 1) { visited[i][1] = true; kolejka.push(make_pair(i, 1)); } } for(int i=0;i<m;i++) { if(mapa[i][0].size() == 1) { visited[i][0] = true; kolejka.push(make_pair(i, 0)); } } while(!kolejka.empty()) { int idx = kolejka.front().first; bool czy_n = kolejka.front().second; kolejka.pop(); char znak; for(pair<int, char> w : mapa[idx][czy_n]) znak = w.first; //cout<<idx<<" "<<znak<<endl; string akt_wypis = ""; if(czy_n) akt_wypis += "R "+to_string(idx+1)+" "+znak; else akt_wypis += "K "+to_string(idx+1)+" "+znak; wypisy.push(akt_wypis); int dim2 = (czy_n ? m : n); for(int i=0;i<dim2;i++) { if(visited[i][!czy_n]) continue; mapa[i][!czy_n][znak]--; //cout<<i<<" usuwamy"<<znak<<" i zostaje "<<mapa[i][!czy_n][znak]<<endl; if(mapa[i][!czy_n].size() > 1 && mapa[i][!czy_n][znak]==0) { auto it = mapa[i][!czy_n].find(znak); mapa[i][!czy_n].erase(it); } if(mapa[i][!czy_n].size() == 1) { visited[i][!czy_n] = true; kolejka.push(make_pair(i, !czy_n)); } } //cout<<"koniec"<<endl;; } cout<<wypisy.size()<<endl; //cout<<n<<" "<<m<<endl; while(!wypisy.empty()) { cout<<wypisy.top()<<endl; wypisy.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 | #include<iostream> #include<map> #include<stack> #include<queue> using namespace std; stack<string> wypisy; int n,m; map<char, int> mapa[2010][2]; bool visited[2010][2]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin>>n>>m; char tab[n][m]; for(int i=0;i<n;i++) { string wejscie; cin>>wejscie; for(int j=0;j<wejscie.size();j++) { tab[i][j] = wejscie[j]; if(mapa[i][1].find(tab[i][j]) == mapa[i][1].end()) mapa[i][1][tab[i][j]] = 1; else mapa[i][1][tab[i][j]]++; if(mapa[j][0].find(tab[i][j]) == mapa[j][0].end()) mapa[j][0][tab[i][j]] = 1; else mapa[j][0][tab[i][j]]++; } } queue< pair<int, bool> > kolejka; for(int i=0;i<n;i++) { if(mapa[i][1].size() == 1) { visited[i][1] = true; kolejka.push(make_pair(i, 1)); } } for(int i=0;i<m;i++) { if(mapa[i][0].size() == 1) { visited[i][0] = true; kolejka.push(make_pair(i, 0)); } } while(!kolejka.empty()) { int idx = kolejka.front().first; bool czy_n = kolejka.front().second; kolejka.pop(); char znak; for(pair<int, char> w : mapa[idx][czy_n]) znak = w.first; //cout<<idx<<" "<<znak<<endl; string akt_wypis = ""; if(czy_n) akt_wypis += "R "+to_string(idx+1)+" "+znak; else akt_wypis += "K "+to_string(idx+1)+" "+znak; wypisy.push(akt_wypis); int dim2 = (czy_n ? m : n); for(int i=0;i<dim2;i++) { if(visited[i][!czy_n]) continue; mapa[i][!czy_n][znak]--; //cout<<i<<" usuwamy"<<znak<<" i zostaje "<<mapa[i][!czy_n][znak]<<endl; if(mapa[i][!czy_n].size() > 1 && mapa[i][!czy_n][znak]==0) { auto it = mapa[i][!czy_n].find(znak); mapa[i][!czy_n].erase(it); } if(mapa[i][!czy_n].size() == 1) { visited[i][!czy_n] = true; kolejka.push(make_pair(i, !czy_n)); } } //cout<<"koniec"<<endl;; } cout<<wypisy.size()<<endl; //cout<<n<<" "<<m<<endl; while(!wypisy.empty()) { cout<<wypisy.top()<<endl; wypisy.pop(); } return 0; } |