E. Adjacent XOR

https://codeforces.com/problemset/problem/2131/E

题意:给定长度为n的两个数组a和b,每次操作可以让a[i] = a[i] ^ a[i + 1],并且每个i只能操作一次。问a能否变为b。

思路:从后往前遍历,依次考虑当前的每个i,如果a[i] == b[i],那么a[i]不能操作,a[i - 1]只能用a[i]来做操作。如果a[i] != b[i],那么看a[i + 1]或者b[i + 1]是否与a[i] ^ b[i]相等,这里假设i后面的位置a和b都已经相等了,那么这里可以考虑两种情况:a[i + 1]与b[i + 1]相等,当时没有做操作,那么就看a[i + 1]是否a[i] ^ b[i]即可。 如果a[i + 1] != b[i + 1],那么在处理a[i + 1]之前,我们可以看need(a[i] ^ b[i])是否a[i + 1],或者在处理a[i + 1]之后(此时a[i + 1] == b[i + 1]),即a[i + 1] == b[i + 1] 是否 ==need..

总结:如果不限制每个下标的操作次数..??

inline void solve() {
    int n;
    cin >> n;

    vector<int> a(n);
    vector<int> b(n);

    for (auto& x : a) {
        cin >> x;
    }

    for (auto& x : b) {
        cin >> x;
    }
    if (a[n - 1] != b[n - 1]) {
        cout << "NO\n";
        return;
    }

    int now = a[n - 1];
    for (int i = n - 2; i >= 0; --i) {
        int need = b[i] ^ a[i];
        bool ok = false;
        if (a[i] == b[i]) {
            continue;
        }
        // else if (a[i + 1] == b[i + 1]) {
        //     if (a[i + 1] == need) {
        //         continue;
        //     }
        // }
        else if (a[i + 1] == need || b[i + 1] == need) {
            continue;
        }
        cout << "NO\n";
        return;
    }

    cout << "YES\n";

    //1 0 0   0 0 1          
}
posted @ 2025-11-24 10:37  _Yxc  阅读(6)  评论(0)    收藏  举报