CF #324 DIV2 C题
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAX=1e5+7; char s1[MAX],s2[MAX],s3[MAX]; char getdif(char a,char b){ for(int i=0;i<26;i++) if('a'+i!=a&&'a'+i!=b) return 'a'+i; } ///考虑的方式时,假设当前字符串与A字符串相同,则不同的贡献值为(0,1),如果与B相同,则贡献值为(1,0),否则为(1,1) int main(){ int n,t,cnt; while(scanf("%d%d",&n,&t)!=EOF){ scanf("%s%s",s1+1,s2+1); cnt=0; for(int i=1;i<=n;i++) if(s1[i]!=s2[i]) cnt++; if(t>n||cnt>2*t){ ///可以发现,这两种情况是无解的 puts("-1"); continue; } int a,b; if(cnt<=t) a=b=cnt;///当不同的个数少于等于要求的个数时,直接让a=b=cnt; else a=b=cnt/2+cnt%2;////如果在于,则可以把cnt先平分,剩下看奇偶 int lcnt=t-a;////看还差多少个可以满足,这时考虑(1,1)的方法 if(n-cnt<lcnt){///如果相同的个数<差的个数 lcnt+=lcnt-(n-cnt);///则需要从不同的个数里把原来只考虑(1,0)或(0,1)的情况改成(1,1) cnt-=lcnt-(n-cnt);///从原来减去 a=b=cnt/2+cnt%2;///更改a,b } for(int i=1;i<=n;i++){ if(s1[i]==s2[i]){ if(lcnt) s3[i]=getdif(s1[i],s2[i]),lcnt--; else s3[i]=s1[i]; } } for(int i=1;i<=n;i++){ if(s1[i]!=s2[i]){ if(lcnt){ s3[i]=getdif(s1[i],s2[i]),lcnt--; cnt--; continue; } if(cnt==a&&a==b) s3[i]=getdif(s1[i],s2[i]), cnt--,a--,b--; else{ if(a>b) s3[i]=s1[i],a--; else s3[i]=s2[i],b--; cnt--; } } } for(int i=1;i<=n;i++) printf("%c",s3[i]); printf("\n"); } return 0; }