本蒟蒻调了一晚上了 QwQ
#include<bits/stdc++.h>
using namespace std;
char mz[600][600];
bool b[600][600],g[600][600],p[600][600];//记录这个地方是不是这个颜色
int ahp[600][600],ahg[600][600],ahb[600][600];//记录以这个地方结尾的矩阵有多少这个颜色,即前缀和
int main()
{
int n,m,k,ll,rr,ss,xx;//依次是:输入的n,m,k,最后答案中颜色一致的最大矩阵的四个端点(左,右,上,下界限)
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mz[i][j];
if(mz[i][j]=='B') b[i][j]=1;
if(mz[i][j]=='P') p[i][j]=1;
if(mz[i][j]=='G') g[i][j]=1;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ahb[i][j]=ahb[i-1][j]+ahb[i][j-1]-ahb[i-1][j-1]+b[i][j];
ahp[i][j]=ahp[i-1][j]+ahp[i][j-1]-ahp[i-1][j-1]+p[i][j];
ahg[i][j]=ahg[i-1][j]+ahg[i][j-1]-ahg[i-1][j-1]+g[i][j];//计算前缀和
}
}
int ans=0;//记录答案 最大子矩阵大小
char ahh;//最后要改成这个颜色
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
for(l=1,r=0;l<=n&&r<=n;l++){
while(r<m&&ahp[j][r+1]-ahp[i-1][r+1]-ahp[j][l-1]+ahp[i-1][l-1]==0&&ahb[j][r+1]-ahb[i-1][r+1]-ahb[j][l-1]+ahb[i-1][l-1]+k>=(r+1-l+1)*(j-i+1)) r++;
// 没超过界限 且没有紫名 且 需要修改的在k次以内
if(ahp[j][r+1]-ahp[i-1][r+1]-ahp[j][l-1]+ahp[i-1][l-1]==0&&ans<(r+1-l+1)*(j-i+1)) {
//没有紫名 且答案更优
ans=(r-l+1)*(j-i+1);
ll=l;rr=r;ss=i;xx=j;ahh='B';//修改答案相关信息 即最优子阵四个边界位置以及颜色
}
}
for(l=1,r=0;l<=n&&r<=n;l++){
while(r<m&&ahp[j][r+1]-ahp[i-1][r+1]-ahp[j][l-1]+ahp[i-1][l-1]==0&&ahg[j][r+1]-ahg[i-1][r+1]-ahg[j][l-1]+ahg[i-1][l-1]+k>=(r+1-l+1)*(j-i+1)) r++;
if(ahp[j][r+1]-ahp[i-1][r+1]-ahp[j][l-1]+ahp[i-1][l-1]==0&&ans<(r+1-l+1)*(j-i+1)) {
ans=(r-l+1)*(j-i+1);
ll=l;rr=r;ss=i;xx=j;ahh='G';
}
}//同上
for(l=1,r=0;l<=n&&r<=n;l++){
while(r<m&&ahp[j][r+1]-ahp[i-1][r+1]-ahp[j][l-1]+ahp[i-1][l-1]==(r+1-l+1)*(j-i+1)) r++;
//没超过边界 且全都是紫名
if(ans<(r+1-l+1)*(j-i+1)) {
ans=(r-l+1)*(j-i+1);
ll=l;rr=r;ss=i;xx=j;ahh='P';//貌似没必要?如果最优子矩阵是紫名就不需要修改了,直接输出原矩阵?
}
}
}
}
cout<<ans;
for(int i=ss;i<=xx;i++){
for(int j=ll;j<=rr;j++){
mz[i][j]=ahh;//修改为最优
}
}
cout<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<mz[i][j];
}
cout<<endl;
}
return 0;//核情核理
}