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
#include<bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define PB push_back
typedef long long ll;
typedef long double ld;
#define REP(x,y) for(int x=0;x<(y);x++)
#define ROF(x,y) for(int x=(y);x>0;x--)
#define FOR(x,z,y) for(int x=(z);x<(y);x++)
#define INT(x) int x;scanf("%d ",&x)
#define LL(x) ll x;scanf("%lld",&x)
#define CZ(x) char x;scanf(" %c",&x)
typedef pair<int,bool> pib;

char t[2005][2005];
set<int> cols,rows;
vector<pair<char,pib>> vec;
short row[2005],col[2005];

queue<pib> q;

int main(){
    INT(n); INT(m);
    REP(i,n){
        fgets(t[i],m+2,stdin);
    }
    REP(i,n){
        char color = t[i][0];
        FOR(j,1,m){
            if(t[i][j]!=color){
                row[i]++;
                color = t[i][j];
            }
        }
        if(row[i]==0) q.push({i,0});
        rows.insert(i);
    }
    REP(i,m){
        char color = t[0][i];
        FOR(j,1,n){
            if(t[j][i]!=color){
                col[i]++;
                color = t[j][i];
            }
        }
        if(col[i]==0) q.push({i,1});
        cols.insert(i);
    }
    while(!q.empty()){
        pib p = q.front();
        q.pop();
        if(p.s){
            auto it = cols.find(p.f);
            int _prev = p.f==*cols.begin() ? p.f: *prev(it,1);
            int _next = p.f==*cols.rbegin() ? p.f: *next(it,1);
            vec.PB({t[*(rows.begin())][p.f],{p.f,1}});
            for(int i:rows){
                if((t[i][p.f]!=t[i][_next] && t[i][p.f]!=t[i][_prev]) || (p.f==_next && t[i][p.f]!=t[i][_prev]) || (p.f==_prev && t[i][p.f]!=t[i][_next])){
                    if(t[i][_prev]==t[i][_next])row[i]-=2;
                    else row[i]--;
                    if(row[i]==0) q.push({i,0});
                }
            }
            cols.erase(p.f);
        }else{
            auto it = rows.find(p.f);
            int _prev = p.f==*rows.begin() ? p.f: *prev(it,1);
            int _next = p.f==*rows.rbegin() ? p.f: *next(it,1);
            vec.PB({t[p.f][*(cols.begin())],{p.f,0}});
            for(int i:cols){
                if((t[p.f][i]!=t[_next][i] && t[p.f][i]!=t[_prev][i]) || (p.f==_next && t[p.f][i]!=t[_prev][i]) || (p.f==_prev && t[p.f][i]!=t[_next][i])){
                    if(t[_prev][i]==t[_next][i])col[i]-=2;
                    else col[i]--;
                    if(col[i]==0) q.push({i,1});
                }
            }
            rows.erase(p.f);
        }
        if(rows.size()==0 || cols.size()==0) break;
    }
    reverse(vec.begin(),vec.end());
    printf("%d\n",vec.size());
    for(auto p:vec){
        printf("%c %d %c\n",p.s.s ? 'K' : 'R' ,p.s.f+1,p.f);
    }
}