zoukankan      html  css  js  c++  java
  • luoguP4735 最大异或和

    https://www.luogu.org/problemnew/show/P4735

    令 s 数组为 a 数组的异或前缀,则题目要求的式子可变为 s[p - 1] ^ s[n] ^ x,s[n] ^ x不变,则可以高效的从高位到低位贪心,凑出一个和 s[n] ^ x 异或最大的值,查询一个区间内的 s 值可用可持久化 trie 实现,方法与主席树类似,这里不再赘述

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 600000 + 10; 
    
    int trie[N * 26][2], siz[N * 26], tot = 0;
    int s[N], root[N], n, m;
    
    template <typename T>
    inline void read(T &f) {
        f = 0; T fu = 1; char c = getchar();
        while(c < '0' || c > '9') {if(c == '-') fu = -1; c = getchar();}
        while(c >= '0' && c <= '9') {f = (f << 3) + (f << 1) + (c & 15); c = getchar();}
        f *= fu;
    }
    
    void ins(int &u, int pre, int d, int x) {
        u = ++tot; siz[u] = siz[pre] + 1; if(d == -1) return;
        trie[u][0] = trie[pre][0]; trie[u][1] = trie[pre][1];
        int now = (x & (1 << d)) >> d; ins(trie[u][now], trie[pre][now], d - 1, x);
    }
    
    int find(int l, int r, int d, int x) {
        if(d == -1) return 0;
        int now = ((x & (1 << d)) >> d) ^ 1;
        if(siz[trie[r][now]] - siz[trie[l][now]]) return (1 << d) * now + find(trie[l][now], trie[r][now], d - 1, x);
        return (1 << d) * (now ^ 1) + find(trie[l][now ^ 1], trie[r][now ^ 1], d - 1, x);
    }
    
    int main() {
        scanf("%d %d", &n, &m);
        for(int i = 1; i <= n; i++) {
            int a; read(a);
            s[i] = s[i - 1] ^ a;
            ins(root[i], root[i - 1], 23, s[i - 1]);
        }
        for(int i = 1; i <= m; i++) {
            char c = getchar();
            while(c != 'A' && c != 'Q') c = getchar();
            if(c == 'A') {
                int a; read(a); n++;
                s[n] = s[n - 1] ^ a;
                ins(root[n], root[n - 1], 23, s[n - 1]);
            } else {
                int l, r, x;
                read(l); read(r); read(x);
                int Ans = s[n] ^ x;
                // 在 l 和 r 之间找和 Ans ^ 最大的
                printf("%d
    ", find(root[l - 1], root[r], 23, Ans) ^ Ans);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    数组,集合,泛型
    DataSet和实体,泛型集合
    数据源绑定控件的Row/ItemDataBound事件
    Access 中时间格式 yyyyMMdd HH:mm:ss
    IMG标记的alt属性和title属性详解
    后台代码(cs)中加空格
    数据绑定控件之绑定项
    数据绑定控件之DataBound事件
    DataSet,DataTable,DateView的关系和用法
    程序编程网
  • 原文地址:https://www.cnblogs.com/LJC00118/p/9557026.html
Copyright © 2011-2022 走看看