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("
");
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/jie-dcai/p/4886319.html