CodeForces 584 C.Marina and Vasya(水~)

Description
给出两个长度为n的字符串,先要求构造出一个长度也为n的串使其满足其与这两个串在相同位置不相同的字符数有t个,如果不存在这样的串则输出-1
Input
第一行两个整数n和t,第二行和第三行分别输入两个长度为n的串
Output
如果满足条件的串则输出,否则输出-1
Sample Input
3 2
abc
xyc
Samlpe Output
ayd
Solution
设给出两个串相同字符的数量为same,那么当n-same<=t时,只需将新串在两串不同的位置赋成不同与两串的字符,在两串相同的位置前t-(n-same)个字符赋成不同与两串的字符,剩下的就和两串一样即可;当n-same>t时说明两串不同的数量已经大于t,那么欲满足条件必须使得新串在两串不同位置一部分(长度为n-same-t)等于第一个串,一部分(长度为n-same-t)等于第二个串,两串相同部分等与两串才可能满足条件,而满足条件的前提是2*(n-same-t) < n-same,即n-same<2*t;n-same>=2*t时无合法情况,输出-1
Code

#include<stdio.h>
#include<string.h>
#define maxn 100001
char s1[maxn],s2[maxn];
char dif(char a,char b)//找到一个与a和b不同的字符 
{
    for(char i='a';i<='z';i++)
        if(i!=a&&i!=b)
            return i;
}
int main()
{
    int n,t;
    while(~scanf("%d%d",&n,&t))
    {
        int same=0;
        scanf("%s%s",s1,s2);
        for(int i=0;i<n;i++)
            if(s1[i]==s2[i])//统计两串相同的数量 
                same++;
        if(n-same>2*t)//不合法情况 
            printf("-1\n");     
        else if(n-t<=same)//第一种合法情况 
        {
            int temp=t-(n-same);
            for(int i=0;i<n;i++)
                if(s1[i]==s2[i])//相同部分
                {
                    if(temp)//前temp个赋成异于两串的字符 
                    {
                        printf("%c",dif(s1[i],s2[i]));
                        temp--;
                    }
                    else//剩下的和两串相同 
                        printf("%c",s1[i]);
                }
                else//不同部分赋成异于两串的字符 
                    printf("%c",dif(s1[i],s2[i]));
            printf("\n");
        }
        else//第二种合法情况 
        {
            int temp1=n-t-same,temp2=n-t-same;
            for(int i=0;i<n;i++)
                if(s1[i]==s2[i])//相同部分和两串相同 
                    printf("%c",s1[i]);
                else//不相同部分 
                {
                    if(temp1)//一部分和1串相同 
                    {
                        printf("%c",s1[i]);
                        temp1--;
                    }
                    else if(temp2)//一部分与2串相同 
                    {
                        printf("%c",s2[i]);
                        temp2--;
                    }
                    else//剩下部分赋成异于两串的字符 
                        printf("%c",dif(s1[i],s2[i]));
                }
            printf("\n");
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值