CF #324 DIV2 C题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#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;
}

  

posted @   chenjunjie1994  阅读(191)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示