牛客(多校5): Git Merge

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
示例1:

输入

#include <bits/stdc++.h>
using namespace std;

int main() {
    int a, b;
<<<<<<< branch1
    cin >> a >> b;
=======
    scanf("%d%d", &a, &b);
>>>>>>> branch2
    if (a < 0 || b < 0) return 1;
<<<<<<< branch1
    cout << a + b << endl;
=======
    printf("%d\n", a + b);a
>>>>>>> branch2
}

输出

#include <bits/stdc++.h>
using namespace std;

int main() {
    int a, b;
#ifdef branch1
    cin >> a >> b;
    if (a < 0 || b < 0) return 1;
    cout << a + b << endl;
#else
    scanf("%d%d", &a, &b);
    if (a < 0 || b < 0) return 1;
    printf("%d\n", a + b);a
#endif
}

示例2:
输入

<<<<<<< branch1
int main() {
    return 0;
}
=======
int main() {
}
>>>>>>> branch2

输出

示例3:
输入

<<<<<<< branch1
int main() {}
=======
int main() {}
>>>>>>> branch2
```cpp
int main() {
#ifdef branch1
    return 0;
#endif
}

输出

int main() {}

在这里插入图片描述

代码:

/*
 * Author       : YangDavid
 * Created Time : 2020.07.25 14:32:26
 */
 
#include<bits/stdc++.h>
#define rep(i, n) for(int i = 1; i <= n; ++i)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<short, short> pii;
 
const ull P = 13313, Q = 233, MAXN = 4020;
vector<string> br1, br2;
vector<ull> hs1, hs2;
 
void input() {
    int state = 0;
    string line;
    while(getline(cin, line)) {
        if(line == "<<<<<<< branch1") {
            state = 1; //
        } else if(line == "=======") {
            state = 2;
        } else if(line == ">>>>>>> branch2") {
            state = 0;
        } else {
            ull mys = 0;
            for(auto g : line) mys = mys * P + Q + g;
            if(state != 1) br2.push_back(line), hs2.push_back(mys);
            if(state != 2) br1.push_back(line), hs1.push_back(mys);
        }
    }
}
 
int dp[MAXN][MAXN], rowcho[MAXN*2], colcho[MAXN*2];
pii fa[MAXN][MAXN], mn[MAXN];
int eval(int i, int j) { return dp[i][j]; }
int eval(pii p) { return dp[p.first][p.second]; }
 
void solve() {
    memset(dp, 0x3f, sizeof dp);
    dp[0][0] = 0;
    int n = (int)br1.size(), m = (int)br2.size();
    for(int i = 0; i <= n; ++i) {
        for(int j = 0; j <= m; ++j) if(i || j) {
            if(j && eval(mn[j]) > eval(mn[j-1])) mn[j] = mn[j-1];
            dp[i][j] = eval(mn[j]) + 3, fa[i][j] = mn[j];
            if(i && j && hs1[i-1] == hs2[j-1] && dp[i-1][j-1]-1 < dp[i][j]) {
                dp[i][j] = dp[i-1][j-1] - 1;
                fa[i][j] = {i-1, j-1};
            }
            if(dp[rowcho[j]][j] + 2 < dp[i][j]) {
                dp[i][j] = dp[rowcho[j]][j] + 2;
                fa[i][j] = {rowcho[j], j};
            }
            if(dp[i][colcho[i]] + 2 < dp[i][j]) {
                dp[i][j] = dp[i][colcho[i]] + 2;
                fa[i][j] = {i, colcho[i]};
            }
            if(dp[i][j] < eval(mn[j])) mn[j] = {i, j};
            if(dp[i][j] < dp[i][colcho[i]]) colcho[i] = j;
            if(dp[i][j] < dp[rowcho[j]][j]) rowcho[j] = i;
        }
    }
    vector<string> ans;
    int x = n, y = m;
    while(x + y > 0) {
        static int fx, fy;
        tie(fx, fy) = fa[x][y];
        if(dp[fx][fy] - 1 == dp[x][y]) {
            ans.push_back(br1[fx]);
        } else if(dp[fx][fy]+2 == dp[x][y]) {
            if(fx == x) {
                ans.emplace_back("#endif");
                for(int i = y-1; i >= fy; --i)
                    ans.push_back(br2[i]);
                ans.emplace_back("#ifdef branch2");
            } else if(fy == y) {
                ans.emplace_back("#endif");
                for(int i = x-1; i >= fx; --i)
                    ans.push_back(br1[i]);
                ans.emplace_back("#ifdef branch1");
            } else assert(false);
        } else {
            ans.emplace_back("#endif");
            for(int i = y-1; i >= fy; --i)
                ans.push_back(br2[i]);
            ans.emplace_back("#else");
            for(int i = x-1; i >= fx; --i)
                ans.push_back(br1[i]);
            ans.emplace_back("#ifdef branch1");
        }
        x = fx, y = fy;
    }
    reverse(ans.begin(), ans.end());
    for(auto line : ans)
        cout << line << '\n';
}
int main() {
    ios::sync_with_stdio(false);
    input();
    solve();
    return 0;
}

此程序来源于竞赛参与者,如有违权联系删除。

猜你喜欢

转载自blog.csdn.net/qq_46144237/article/details/107586321