• 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;
    }
    

      

  • 相关阅读:
    将数据加载时显示的图片和文字提成公共的--实现方法
    JavaScript【面向对象】-静态方法-私有方法-公有方法-特权方法
    强大的JS数组
    sql工作问题总结
    JSON.stringify()的使用--将string转换成json
    JS小技巧
    JS工作积累
    (六)Redis之数据结构之Set
    (五)Redis之List
    (四)Redis之哈希
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4886319.html
Copyright © 2020-2023  润新知