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;
}
原文地址:https://www.cnblogs.com/HarryGuo2012/p/4858609.html