题意是构造一个字符串,长度为n,和s1,s2不同的个数均为t,与s1和s2不同的个数均为t说明和它们相同的个数为n-t.那我们就根据题意构造出和它们相同个数为n-t
什么情况下会无解呢,我们用sum表示s1和s2相同的字符个数,如果sum小于n-t,那么对应输出的字符串还需要和s1相同的字符的个数为:cnta=n-t-相同的数量,当然同理,还需要和s2相同的字符的个数也是:cntb=n-t-相同的数量
即cnta=n-t-sum,cntb=n-t-sum,当cnta+cntb>n-sum时,即2*sum+(n-sum)<2*(n-t)时无解,直接输出-1.
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
char a[N], b[N], c[N];
int cnt;
int main()
{
int n, t;
cin >> n >> t;
scanf("%s", a);
scanf("%s", b);
int sum = 0;
for (int i = 0; a[i]; i++)
if (a[i] == b[i])
sum++;//相同的个数
int m = n - t;
if (sum + (n - sum) / 2 < m)
{
puts("-1");
return 0;
}
int k = min(sum, m);
int cnt = 0;
for (int i = 0, cnt = 1; a[i] && cnt <= k; i++) if (a[i] == b[i]) c[i] = a[i], cnt++;//和a,b都相同的直接输出
int s = m - k;//cnta和cntb
for (int i = 0, cnt = 1; a[i] && cnt <= s; i++) if ((a[i] != b[i]) && !c[i]) c[i] = a[i], cnt++;//构造出cnta个仅和a相同的字符
for (int i = 0, cnt = 1; a[i] && cnt <= s; i++) if ((a[i] != b[i]) && !c[i]) c[i] = b[i], cnt++;//构造出cntb个仅和b相同的字符
for (int i = 0; a[i]; i++)//剩下构造出和a,b都不相同的字符
{
if (!c[i])
{
for (char j = 'a'; j <= 'z'; j++)
if (j != a[i] && j != b[i])
{
c[i] = j;
break;
}
}
}
printf("%s", c);
return 0;
}