题目链接:https://codeforces.com/contest/18/problem/E
#include <iostream>
#include <cstring>
using namespace std;
static const int MAXN=500+10;
static const int MAXM=26+3;
int val[MAXN][MAXM][MAXM];
int dp[MAXN][MAXM][MAXM];
int path[MAXN][MAXM][MAXM];
int ans[MAXN];
char g[MAXN][MAXN];
int n,m;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%s",g[i]+1);
for(int i=1;i<=n;i++)
for(int a=0;a<26;a++)
for(int b=0;b<26;b++)
{
if(a==b) continue;
for(int j=1;j<=m;j++)
if(g[i][j]!=(j%2?a+'a':b+'a')) val[i][a][b]++;
}
memset(dp,0x3f,sizeof(dp));
for(int i=0;i<26;i++)
for(int j=0;j<26;j++)
dp[0][i][j]=0;
for(int i=1;i<=n;i++)
for(int a=0;a<26;a++)
for(int b=0;b<=26;b++)
{
if(a==b) continue;
for(int aa=0;aa<26;aa++)
{
if(aa==a) continue;
for(int bb=0;bb<26;bb++)
{
if(aa==bb || bb==b) continue;
if(dp[i][a][b]>dp[i-1][aa][bb]+val[i][a][b])
{
dp[i][a][b]=dp[i-1][aa][bb]+val[i][a][b];
path[i][a][b]=aa*100+bb;
}
}
}
}
int res=0x3f3f3f3f,posa,posb;
for(int i=0;i<26;i++)
for(int j=0;j<26;j++)
if(res>dp[n][i][j])
{
res=dp[n][i][j];
posa=i; posb=j;
}
printf("%d\n",res);
ans[n]=posa*100+posb;
for(int i=n-1;i>=1;i--)
{
ans[i]=path[i+1][posa][posb];
int a=path[i+1][posa][posb]/100;
int b=path[i+1][posa][posb]%100;
posa=a; posb=b;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
if(j%2) printf("%c",'a'+ans[i]/100);
else printf("%c",'a'+ans[i]%100);
printf("\n");
}
return 0;
}