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
128
129
130
#include <iostream>
#include <algorithm>
#include <vector>
//#include <set>
#include <cassert>
#include <chrono>
#include <bitset>
//#include <map>
#include <unordered_map>
#include <unordered_set>
using namespace std;

struct RzadKolumna
{
  std::vector<signed char> kolory;
  std::unordered_map<signed char, int> iloscPolOKolorze;
  void setColor(int pozycja, signed char kolor);
  bool czyGotowyDoMalowania();
  signed char getKolorDoMalowania();
};

void RzadKolumna::setColor(int pozycja, signed char kolor)
{
  if (kolory[pozycja] >=0)
  {
    iloscPolOKolorze[kolory[pozycja]]--;
    if (iloscPolOKolorze[kolory[pozycja]] == 0)
      iloscPolOKolorze.erase(kolory[pozycja]);
  }
  kolory[pozycja] = kolor;
  if (kolor>=0)
    iloscPolOKolorze[kolor]++;
}

bool RzadKolumna::czyGotowyDoMalowania()
{
  int ilosc = iloscPolOKolorze.size();
  return ilosc == 1;
}

signed char RzadKolumna::getKolorDoMalowania()
{
  return iloscPolOKolorze.begin()->first;
}

class Plansza
{
public:
  std::vector<RzadKolumna> rzedy;
  std::vector<RzadKolumna> kolumny;
  std::unordered_set<int> rzedyDoMalowania;
  std::unordered_set<int> kolumnyDoMalowania;
  Plansza(int iloscKolumn, int iloscRzedow)
  {
    for (int i = 0; i < iloscKolumn; ++i)
    {
      RzadKolumna kolumna;
      kolumna.kolory.resize(iloscRzedow, -1);
      kolumny.push_back(kolumna);
    }
    for (int i = 0; i < iloscRzedow; ++i)
    {
      RzadKolumna rzad;
      rzad.kolory.resize(iloscKolumn, -1);
      rzedy.push_back(rzad);
    }
  }
  void setKolor(int kolumna, int rzad, signed char kolor)
  {
    rzedy[rzad].setColor(kolumna, kolor);
    bool czyRzadDoMalowania = rzedy[rzad].czyGotowyDoMalowania();
    if (czyRzadDoMalowania)
      rzedyDoMalowania.insert(rzad);
    else
      rzedyDoMalowania.erase(rzad);
    kolumny[kolumna].setColor(rzad, kolor);
    bool czyKolumnaDoMalowania = kolumny[kolumna].czyGotowyDoMalowania();
    if (czyKolumnaDoMalowania)
      kolumnyDoMalowania.insert(kolumna);
    else
      kolumnyDoMalowania.erase(kolumna);
  }
};


int main()
{
  int iloscRzedow;
  int iloscKolumn;
  std::cin >> iloscRzedow >> iloscKolumn;
  Plansza plansza(iloscKolumn, iloscRzedow);
  for (int rzad = 0; rzad < iloscRzedow; ++rzad)
  {
    std::string rzadString;
    std::cin >> rzadString;
    assert(rzadString.size() == iloscKolumn);
    for (int kolumna = 0; kolumna < iloscKolumn; ++kolumna)
    {
      plansza.setKolor(kolumna, rzad, rzadString[kolumna]);
    }
  }
  std::vector<std::string> stringiToPrint;
  while (!plansza.kolumnyDoMalowania.empty() || !plansza.rzedyDoMalowania.empty())
  {
    if (!plansza.kolumnyDoMalowania.empty())
    {
      int kolumna = *plansza.kolumnyDoMalowania.begin();
      signed char kolor = plansza.kolumny[kolumna].getKolorDoMalowania();
      assert(kolor != -1);
      stringiToPrint.push_back("K " + std::to_string(kolumna + 1) + " " + std::string(1, kolor) + "\n");
      for (int rzad = 0; rzad < iloscRzedow; ++rzad)
        plansza.setKolor(kolumna, rzad, -1);
      continue;
    }
    if (!plansza.rzedyDoMalowania.empty())
    {
      int rzad = *plansza.rzedyDoMalowania.begin();
      signed char kolor = plansza.rzedy[rzad].getKolorDoMalowania();
      assert(kolor != -1);
      stringiToPrint.push_back("R " + std::to_string(rzad + 1) + " " + std::string(1, kolor) + "\n");
      for (int kolumna = 0; kolumna < iloscKolumn; ++kolumna)
        plansza.setKolor(kolumna, rzad, -1);
      continue;
    }
  }
  std::cout << stringiToPrint.size() << "\n";
  for (int i = stringiToPrint.size() - 1; i >= 0; --i)
    std::cout << stringiToPrint[i];
  return 0;
}