Codeforces Round #324 (Div. 2) Marina and Vasya 乱搞推理
原题链接:http://codeforces.com/contest/584/problem/C
题意:
定义$f(s1,s2)$为$s1,s2$不同的字母的个数。现在让你构造一个串$s3$,使得$f(s1,s3)=f(s2,s3)=t$。
题解:
设$s1,s2$共有$a$个相同的字母,共有$b$个不同的字母。现在在这$a$个相同的字母中,我让$s3$有$x$个字母和$s1,s2$不同;在这$b$个不同的字母中,我让$s3$有$y$个字母和$s1,s2$都不相同,有$z$个字母和$s1$不同。则我们可以得到以下的约束关系:
$$f(s1,s3)=x+y+z=t$$
$$f(s2,s3)=x+y+(b-y-z)=x+b-z=t$$
$$x \in [0,a]$$
$$y \in [0,b]$$
$$z \in [0,b]$$
$$y+z \in [0,b]$$
然后通过枚举$x$,检查$y,z$就能得到答案了。
代码:
#include<iostream> #include<cstring> #include<string> #define MAX_N 100005 using namespace std; int n,t; string s1,s2; int ans[MAX_N]; int main() { cin.sync_with_stdio(false); cin >> n >> t >> s1 >> s2; int a = 0, b = 0; for (int i = 0; i < n; i++) { a += (s1[i] == s2[i]); b += (s1[i] != s2[i]); } for (int x = 0; x <= a; x++) { int z = b + x - t; int y = t - z - x; if (z < 0 || z > b || y < 0 || y > b || y + z > b)continue; for (int i = 0; i < n; i++) { if (s1[i] == s2[i]) { if (x)ans[i] = (s1[i] == 'z' ? 'a' : s1[i] + 1), x--; else ans[i] = s1[i]; } else { if (y) { int tmp = 'a'; while (tmp == s1[i] || tmp == s2[i])tmp++; ans[i] = tmp; y--; } else if (z)ans[i] = s1[i], z--; else ans[i] = s2[i]; } } for (int i = 0; i < n; i++)cout << (char) ans[i]; cout << endl; return 0; } cout << -1 << endl; return 0; }