#include<bits/stdc++.h> using namespace std; int n, m, kolumny[2010][2012], wiersze[2010][2012], ilew[2*2010], ilewwierszu[2010]; string s; char plansza[2010][2010]; set<int> bylo; vector<int> odp, kolory; int main(){ cin >> n >> m; for(int i=0;i<n;i++){ cin >> s; for(int j=0;j<m;j++){ plansza[i][j] = s[j]; kolumny[j][(int)(s[j]-'A')]++; wiersze[i][(int)(s[j]-'A')]++; if(kolumny[j][(int)(s[j]-'A')] == 1)ilew[j]++; if(wiersze[i][(int)(s[j]-'A')] == 1)ilew[i+2010]++; } } vector<int> kolejka; int it=0; for(int i=0;i<n;i++){ //cout << ilew[i+2010] <<endl; if(ilew[i+2010]==1)kolejka.push_back(i+2010); } //cout << "fr" << endl; for(int i=0;i<m;i++){ //cout << ilew[i] << endl; if(ilew[i]==1)kolejka.push_back(i); } //cout << "kon" << endl; while(it<kolejka.size()){ int j; if(!bylo.count(kolejka[it])){ //cout << kolejka[it] << endl; bylo.insert(kolejka[it]); if(kolejka[it]>2009){ j=kolejka[it]-2010; int h=0; while(!wiersze[j][h] && h<2010){h++;}; kolory.push_back(h); odp.push_back(kolejka[it]); for(int i=0;i<m;i++){ kolumny[i][(int)(plansza[j][i]-'A')]--; wiersze[j][(int)(plansza[j][i]-'A')]--; if(kolumny[i][(int)(plansza[j][i]-'A')] == 0)ilew[i]--; if(wiersze[j][(int)(plansza[j][i]-'A')] == 0)ilew[j+2010]--; if(ilew[i]==1){ kolejka.push_back(i); //odp.push_back(i); ilew[i]=10000; } } }else{ j=kolejka[it]; int h=0; while(!kolumny[j][h] && h<2010){h++;}; kolory.push_back(h); odp.push_back(kolejka[it]); for(int i=0;i<n;i++){ kolumny[j][(int)(plansza[i][j]-'A')]--; wiersze[i][(int)(plansza[i][j]-'A')]--; if(kolumny[j][(int)(plansza[i][j]-'A')] == 0)ilew[j]--; if(wiersze[i][(int)(plansza[i][j]-'A')] == 0)ilew[i+2010]--; if(ilew[i+2010]==1){ kolejka.push_back(i+2010); ilew[i+2010]=10000; //odp.push_back(i+2010); } } }} it++; } reverse(odp.begin(), odp.end()); reverse(kolory.begin(), kolory.end()); /*for(int i:odp)cout << i << " "; cout << endl; for(int i:kolory)cout << i << " ";*/ int ile=0; for(int i=0;i<kolory.size();i++)if(kolory[i]!=2010)ile++; cout << ile << endl; for(int i=0;i<odp.size();i++){ //cout << odp[i] << " " << kolory[i] << endl; if(odp[i]>2009){ if(kolory[i]!=2010)cout << "R " << odp[i]-2010+1 << " " << (char)(kolory[i]+'A') << endl; }else{ if(kolory[i]!=2010)cout << "K " << odp[i]+1 << " " << (char)(kolory[i]+'A') << endl; } } }
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 | #include<bits/stdc++.h> using namespace std; int n, m, kolumny[2010][2012], wiersze[2010][2012], ilew[2*2010], ilewwierszu[2010]; string s; char plansza[2010][2010]; set<int> bylo; vector<int> odp, kolory; int main(){ cin >> n >> m; for(int i=0;i<n;i++){ cin >> s; for(int j=0;j<m;j++){ plansza[i][j] = s[j]; kolumny[j][(int)(s[j]-'A')]++; wiersze[i][(int)(s[j]-'A')]++; if(kolumny[j][(int)(s[j]-'A')] == 1)ilew[j]++; if(wiersze[i][(int)(s[j]-'A')] == 1)ilew[i+2010]++; } } vector<int> kolejka; int it=0; for(int i=0;i<n;i++){ //cout << ilew[i+2010] <<endl; if(ilew[i+2010]==1)kolejka.push_back(i+2010); } //cout << "fr" << endl; for(int i=0;i<m;i++){ //cout << ilew[i] << endl; if(ilew[i]==1)kolejka.push_back(i); } //cout << "kon" << endl; while(it<kolejka.size()){ int j; if(!bylo.count(kolejka[it])){ //cout << kolejka[it] << endl; bylo.insert(kolejka[it]); if(kolejka[it]>2009){ j=kolejka[it]-2010; int h=0; while(!wiersze[j][h] && h<2010){h++;}; kolory.push_back(h); odp.push_back(kolejka[it]); for(int i=0;i<m;i++){ kolumny[i][(int)(plansza[j][i]-'A')]--; wiersze[j][(int)(plansza[j][i]-'A')]--; if(kolumny[i][(int)(plansza[j][i]-'A')] == 0)ilew[i]--; if(wiersze[j][(int)(plansza[j][i]-'A')] == 0)ilew[j+2010]--; if(ilew[i]==1){ kolejka.push_back(i); //odp.push_back(i); ilew[i]=10000; } } }else{ j=kolejka[it]; int h=0; while(!kolumny[j][h] && h<2010){h++;}; kolory.push_back(h); odp.push_back(kolejka[it]); for(int i=0;i<n;i++){ kolumny[j][(int)(plansza[i][j]-'A')]--; wiersze[i][(int)(plansza[i][j]-'A')]--; if(kolumny[j][(int)(plansza[i][j]-'A')] == 0)ilew[j]--; if(wiersze[i][(int)(plansza[i][j]-'A')] == 0)ilew[i+2010]--; if(ilew[i+2010]==1){ kolejka.push_back(i+2010); ilew[i+2010]=10000; //odp.push_back(i+2010); } } }} it++; } reverse(odp.begin(), odp.end()); reverse(kolory.begin(), kolory.end()); /*for(int i:odp)cout << i << " "; cout << endl; for(int i:kolory)cout << i << " ";*/ int ile=0; for(int i=0;i<kolory.size();i++)if(kolory[i]!=2010)ile++; cout << ile << endl; for(int i=0;i<odp.size();i++){ //cout << odp[i] << " " << kolory[i] << endl; if(odp[i]>2009){ if(kolory[i]!=2010)cout << "R " << odp[i]-2010+1 << " " << (char)(kolory[i]+'A') << endl; }else{ if(kolory[i]!=2010)cout << "K " << odp[i]+1 << " " << (char)(kolory[i]+'A') << endl; } } } |