提交链接:http://codeforces.com/problemset/problem/584/C
题面:
构造一任意串,使得其与给定两串刚好有t个字符不同。若无法构造输出-1。
解题:
分类讨论。
统计给定两串的不同字符数为x。
1.t=x
保持原来相同部分不变,不同部分与两串都不相同。
2.t>x
不同部分,产生一个字符,使之不同,相同部分取(t-x)个使之不同。
3.t<x
保持相同部分不变,另挑(x-t)个原不同位置,使之与a串相同,同理,b串。
此操作最后需检验一遍,可能无法构造。输出-1。
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
#include <map>
#include <vector>
#define LL long long
using namespace std;
bool status[100010];
char generate(char a,char b)
{
char tmp;
for(int i=0;i<26;i++)
{
tmp='a'+i;
if(tmp!=a&&tmp!=b)
return tmp;
}
}
int count_dif(string a,string b,int len)
{
int res=0;
for(int i=0;i<len;i++)
if(a[i]!=b[i])
res++;
return res;
}
int main()
{
int n,t,dif=0;
string a,b,c;
cin>>n>>t;
cin>>a>>b;
c=string(n,'a');
vector <int> pos;
memset(status,0,sizeof(status));
for(int i=0;i<n;i++)
{
if(a[i]!=b[i])
dif++;
else
status[i]=1;
}
if(t==dif)
{
for(int i=0;i<n;i++)
{
if(status[i])
c[i]=a[i];
else
c[i]=generate(a[i],b[i]);
}
}
else if(t>dif)
{
int cnt=0;
for(int i=0;i<n;i++)
{
if(status[i])
{
if(cnt<(t-dif))
{
c[i]=generate(a[i],b[i]);
cnt++;
}
else
c[i]=a[i];
}
else
{
c[i]=generate(a[i],b[i]);
}
}
}
else
{
int cnt1=0,cnt2=0;
for(int i=0;i<n;i++)
{
if(status[i])
c[i]=a[i];
else
{
if(cnt1<(dif-t))
{
c[i]=a[i];
cnt1++;
}
else if(cnt2<(dif-t))
{
c[i]=b[i];
cnt2++;
}
else
c[i]=generate(a[i],b[i]);
}
}
}
if(count_dif(a,c,n)==t&&count_dif(b,c,n)==t)
cout<<c<<endl;
else
cout<<"-1\n";
return 0;
}