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
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Arti1990, II UWr

#include <bits/stdc++.h>

#define forr(i, n)                  for(int i=0; i<n; i++)
#define FOREACH(iter, coll)         for(auto iter = coll.begin(); iter != coll.end(); ++iter)
#define FOREACHR(iter, coll)        for(auto iter = coll.rbegin(); iter != coll.rend(); ++iter)
#define lbound(P,K,FUN)             ({auto SSS=P, PPP = P-1, KKK=(K)+1; while(PPP+1!=KKK) {SSS = (PPP+(KKK-PPP)/2); if(FUN(SSS)) KKK = SSS; else PPP = SSS;} PPP;})
#define testy()                     int _tests; cin>>_tests; FOR(_test, 1, _tests)
#define CLEAR(tab)                  memset(tab, 0, sizeof(tab))
#define CONTAIN(el, coll)           (coll.find(el) != coll.end())
#define FOR(i, a, b)                for(int i=a; i<=b; i++)
#define FORD(i, a, b)               for(int i=a; i>=b; i--)
#define MP                          make_pair
#define PB                          push_back
#define ff                          first
#define ss                          second
#define deb(X)                      X;
#define SIZE(coll) 					((int)coll.size())

#define M 1000000007
#define INF 1000000007LL

using namespace std;

int n, m;
string tab[2007];
int ile_w[2007][128], ile_k[2007][128];
deque <pair<char, pair<int, char>>> res,todo; // R/K, nr, litera

void zdejmij(int w, int k)
{
    ile_w[w][0]--;
    ile_w[w][tab[w][k]]--;
    if(ile_w[w][0] > 0)
        FOR(c, 'A', 'Z')
            if(ile_w[w][0] == ile_w[w][c])
            {
                //cout << "wiersz " << w << ", ile: " << ile_w[w][0] << ", usunie " << c << '\n';
                todo.PB({'R', {w, c}});
                ile_w[w][0] = -1;
            }

    ile_k[k][0]--;
    ile_k[k][tab[w][k]]--;
    if(ile_k[k][0] > 0)
        FOR(c, 'A', 'Z')
            if(ile_k[k][0] == ile_k[k][c])
            {
                //cout << "kolumna " << k << ", ile: " << ile_k[k][0] << ", usunie " << c << '\n';
                todo.PB({'K', {k, c}});
                ile_k[k][0] = -1;
            }

    tab[w][k] = '.';
}

int solve()
{
    cin >> n >> m;
    forr(i, n)
        cin >> tab[i];

    forr(i, n)
        forr(j, m)
        {
            ile_w[i][0]++;
            ile_w[i][tab[i][j]]++;
            if(ile_w[i][tab[i][j]] == m)
            {
                ile_w[i][tab[i][j]] = -1;
                todo.PB({'R', {i, tab[i][j]}});
            }
                
            ile_k[j][0]++;
            ile_k[j][tab[i][j]]++;
            if(ile_k[j][tab[i][j]] == n)
            {
                ile_k[j][tab[i][j]] = -1;
                todo.PB({'K', {j, tab[i][j]}});   
            }             
        }

    while(!todo.empty())
    {
        auto el = todo.front();
        todo.pop_front();
        res.push_front(el);
        int nr = el.ss.ff;

        if(el.ff == 'R')
        {
            ile_w[nr][0] = 0;
            forr(j, m)
                zdejmij(nr, j);
        }
        else
        {
            ile_k[nr][0] = 0;
            forr(i, n)
                zdejmij(i, nr);
        }

        /*
        cout << "zdejmuje " << el.ff << " " << nr << ": " << '\n';
        forr(i, n)
            cout << tab[i] << '\n';
        */
    }

    cout << res.size() << '\n';
    for(auto el : res)
        cout << el.ff << " " << el.ss.ff+1 << " " << el.ss.ss << '\n';

    return 0;
}

int main()
{
    std::ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    solve();

    return 0;
}