Codeforces 219C Color Stripe 贪心

来源:互联网 发布:数学作图软件 编辑:程序博客网 时间:2024/05/22 11:46

点击打开链接

题意:给出一个字符串,只包含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');elseprintf("%c",'B');}}else{cout<<S<<endl;for(int i=1;i<=n;i++){if(i%2)printf("%c",'B');elseprintf("%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;}

0 0
原创粉丝点击