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
#include<iostream>
#include<list>
#include<vector>
#include<string.h>

using namespace std;

char matryca[2001][2001];

struct TKolumnaWiersz {
	int nrLinii;
	int licznosci[26];
	unsigned short int ileKolorow;
};

int main() {
	ios_base::sync_with_stdio(0);

	int n, m;
	TKolumnaWiersz we;
	list<TKolumnaWiersz> W, K;
	list<TKolumnaWiersz>::iterator itW, itK;
	int iDoUs;
	int doUs[2001];
	vector<string> wynik;

	cin >> n >> m;

	for(int i = 0; i < n; ++i) {
		cin >> matryca[i];
		memset(&we, 0, sizeof(we));
		we.nrLinii = i;
		for(int j = 0; j < m; ++j)
			++we.licznosci[matryca[i][j] - 'A'];
		for(int j = 0; j < 26; ++j)
			if(we.licznosci[j])
				++we.ileKolorow;
		W.push_back(we);
	}

	for(int i = 0; i < m; ++i) {
		memset(&we, 0, sizeof(we));
		we.nrLinii = i;
		for(int j = 0; j < n; ++j)
			++we.licznosci[matryca[j][i] - 'A'];
		for(int j = 0; j < 26; ++j)
			if(we.licznosci[j])
				++we.ileKolorow;
		K.push_back(we);
	}

	iDoUs = 0;
	while(W.size() && K.size()) {

		if(iDoUs)
			for (list<TKolumnaWiersz>::iterator it = W.begin(); it != W.end(); ++it)
				for(int i = 0; i < iDoUs; ++i)
					if(!--it->licznosci[matryca[it->nrLinii][doUs[i]] - 'A'])
						--it->ileKolorow;

		iDoUs = 0;
		for (list<TKolumnaWiersz>::iterator it = W.begin(); it != W.end();) {
			if(it->ileKolorow == 0) {
				it = W.erase(it);
				continue;
			}
			if(it->ileKolorow == 1) {
				for(int j = 0; j < 26; ++j)
					if(it->licznosci[j]) {
						//cout << "R " << it->nrLinii + 1 << " " << char('A' + j) << endl;
						wynik.push_back("R " + to_string(it->nrLinii + 1) + " " + char('A' + j));
						break;
					}
				doUs[iDoUs++] = it->nrLinii;
				it = W.erase(it);
				continue;
			}
			++it;
		}

		if(iDoUs)
			for (list<TKolumnaWiersz>::iterator it = K.begin(); it != K.end(); ++it)
				for(int i = 0; i < iDoUs; ++i)
					if(!--it->licznosci[matryca[doUs[i]][it->nrLinii] - 'A'])
						--it->ileKolorow;

		iDoUs = 0;
		for (list<TKolumnaWiersz>::iterator it = K.begin(); it != K.end();) {
			if(it->ileKolorow == 0) {
				it = K.erase(it);
				continue;
			}
			if(it->ileKolorow == 1) {
				for(int j = 0; j < 26; ++j)
					if(it->licznosci[j]) {
						//cout << "K " << it->nrLinii + 1 << " " << char('A' + j) << endl;
						wynik.push_back("K " + to_string(it->nrLinii + 1) + " " + char('A' + j));
						break;
					}
				doUs[iDoUs++] = it->nrLinii;
				it = K.erase(it);
				continue;
			}
			++it;
		}


//		itW = W.erase(W.begin());
//		itK = K.erase(K.begin());
	}

	cout << wynik.size() << endl;
	for(int i = wynik.size() - 1; i >= 0; --i)
		cout << wynik[i] << endl;

	return 0;
}