#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
vector<vector<int>> p(n,vector<int> (m));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
char x;
cin>>x;
p[i][j]=x-'A';
}
vector<vector<int>> r(n,vector<int> (26,0));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
r[i][p[i][j]]++;
vector<vector<int>> c(m,vector<int> (26,0));
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
c[i][p[j][i]]++;
vector<int> rl(n);
vector<int> cl(m);
vector<bool> rb(n,0);
vector<bool> cb(m,0);
queue<pair<pair<char,int>,char>> q;
for(int i=0;i<n;i++)
{
for(int j=0;j<26;j++)
if(r[i][j]>0) rl[i]++;
if(rl[i]==1) {q.push({{'R',i},'A'+p[i][0]});rb[i]=true;}
}
for(int i=0;i<m;i++)
{
for(int j=0;j<26;j++)
if(c[i][j]>0) cl[i]++;
if(cl[i]==1) {q.push({{'K',i},'A'+p[0][i]});cb[i]=true;}
}
int rcnt=0,ccnt=0;
queue<int> qr,qc;
for(int i=0;i<n;i++) qr.push(i);
for(int i=0;i<m;i++) qc.push(i);
vector<pair<pair<char,int>,char>> ans;
while(rcnt!=n && ccnt!=m)
{
auto a=q.front();
q.pop();
ans.push_back(a);
int i=a.first.second;
if(a.first.first=='R')
{
rcnt++;
for(int j=0;j<m;j++)
{
if(cb[j]==true) continue;
c[j][p[i][j]]--;
if(c[j][p[i][j]]==0) cl[j]--;
if(cl[j]==1)
{
for(int k=0;k<26;k++)
{
if(c[j][k]>0)
{
q.push({{'K',j},'A'+k});
cb[j]=true;
}
}
}
}
}
else
{
ccnt++;
for(int j=0;j<n;j++)
{
if(rb[j]==true) continue;
r[j][p[j][i]]--;
if(r[j][p[j][i]]==0) rl[j]--;
if(rl[j]==1)
{
for(int k=0;k<26;k++)
{
if(r[j][k]>0)
{
q.push({{'R',j},'A'+k});
rb[j]=true;
}
}
}
}
}
}
cout<<ans.size()<<endl;
for(int i=ans.size()-1;i>=0;i--) cout<<ans[i].first.first<<" "<<ans[i].first.second+1<<" "<<ans[i].second<<endl;
}
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 | #include <bits/stdc++.h> using namespace std; int main() { int n,m; cin>>n>>m; vector<vector<int>> p(n,vector<int> (m)); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { char x; cin>>x; p[i][j]=x-'A'; } vector<vector<int>> r(n,vector<int> (26,0)); for(int i=0;i<n;i++) for(int j=0;j<m;j++) r[i][p[i][j]]++; vector<vector<int>> c(m,vector<int> (26,0)); for(int i=0;i<m;i++) for(int j=0;j<n;j++) c[i][p[j][i]]++; vector<int> rl(n); vector<int> cl(m); vector<bool> rb(n,0); vector<bool> cb(m,0); queue<pair<pair<char,int>,char>> q; for(int i=0;i<n;i++) { for(int j=0;j<26;j++) if(r[i][j]>0) rl[i]++; if(rl[i]==1) {q.push({{'R',i},'A'+p[i][0]});rb[i]=true;} } for(int i=0;i<m;i++) { for(int j=0;j<26;j++) if(c[i][j]>0) cl[i]++; if(cl[i]==1) {q.push({{'K',i},'A'+p[0][i]});cb[i]=true;} } int rcnt=0,ccnt=0; queue<int> qr,qc; for(int i=0;i<n;i++) qr.push(i); for(int i=0;i<m;i++) qc.push(i); vector<pair<pair<char,int>,char>> ans; while(rcnt!=n && ccnt!=m) { auto a=q.front(); q.pop(); ans.push_back(a); int i=a.first.second; if(a.first.first=='R') { rcnt++; for(int j=0;j<m;j++) { if(cb[j]==true) continue; c[j][p[i][j]]--; if(c[j][p[i][j]]==0) cl[j]--; if(cl[j]==1) { for(int k=0;k<26;k++) { if(c[j][k]>0) { q.push({{'K',j},'A'+k}); cb[j]=true; } } } } } else { ccnt++; for(int j=0;j<n;j++) { if(rb[j]==true) continue; r[j][p[j][i]]--; if(r[j][p[j][i]]==0) rl[j]--; if(rl[j]==1) { for(int k=0;k<26;k++) { if(r[j][k]>0) { q.push({{'R',j},'A'+k}); rb[j]=true; } } } } } } cout<<ans.size()<<endl; for(int i=ans.size()-1;i>=0;i--) cout<<ans[i].first.first<<" "<<ans[i].first.second+1<<" "<<ans[i].second<<endl; } |
English