题意:给出一个字符串,只包含k种字符,问最少修改多少个字符(不增长新的种类)能够得到一个新的字符串,这个字符串满足相邻的字符没有相同的。
最多有n-1对要修改,
当k>=3 s[i]!=s[i-1] 则修改s[i]最优,因为可以消去的对数>=1
当k==2时 AAB,BBB 显然无法贪心 因为k==2的合法情况只有"ABABAB","BABABA"统计错误少的方案输出即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+20;
int n,k;
char s[N];
int a[N];
int main()
{
while(cin>>n>>k)
{
scanf("%s",s+1);
int cnt=0;
for(int i=1;i<=n;i++)
a[i]=s[i]-'A';
//要么为ABABAB,BABABA统计错位个数
int f=0,S=0;
if(k==2)
{
for(int i=1;i<=n;i++)
{
if(i%2&&s[i]=='A'||(i%2==0&&s[i]=='B'))
S++;
if(i%2&&s[i]=='B'||(i%2==0&&s[i]=='A'))
f++;
}
if(f<S)
{
cout<<f<<endl;
for(int i=1;i<=n;i++)
{
if(i%2)
printf("%c",'A');
else
printf("%c",'B');
}
}
else
{
cout<<S<<endl;
for(int i=1;i<=n;i++)
{
if(i%2)
printf("%c",'B');
else
printf("%c",'A');
}
}
cout<<endl;
continue;
}
a[0]=-1;
//最多有n-1对相同
for(int i=1;i<=n;i++)
{
if(a[i]==a[i-1])
{
cnt++;
//改中间a[i],使得消除对数>=1
a[i]=(a[i]+1)%k;
if(a[i]==a[i+1])
{
//改成与后一个不同颜色
a[i]=(a[i]+1)%k;
}
}
}
cout<<cnt<<endl;
for(int i=1;i<=n;i++)
printf("%c",a[i]+'A');
cout<<endl;
}
return 0;
}