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