Codeforces 584C Marina and Vasya(构造)

题意是构造一个字符串,长度为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; }

 

posted @ 2019-02-17 20:19  TLE自动机  阅读(204)  评论(0编辑  收藏  举报