zoukankan      html  css  js  c++  java
  • 【BZOJ4260】Codechef REBXOR

    题面

    http://darkbzoj.tk/problem/4260

    题解

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #define ri register int
    #define N 400050
    #define INF (1<<30)
    using namespace std;
    
    int n,L[N],R[N];
    int a[N],sum1[N],sum2[N];
    
    inline int dit(int x,int i){
      if (x&(1<<i)) return 1; else return 0;
    }
    
    struct TRIE {
      int ch[N*30][2],tot;
      void init() {tot=0;}
      void clear() {
        for (ri i=0;i<=tot;i++) ch[i][0]=ch[i][1]=0;
        tot=0;
      }
      void insert(int x) {
        int now=0;
        for (ri i=30;i>=0;i--) {
          int d=dit(x,i);
          if (!ch[now][d]) ch[now][d]=++tot;
          now=ch[now][d];
        }
      }
      int search(int x) {
        int ret=0,now=0;
        for (ri i=30;i>=0;i--) {
          int d=1^dit(x,i);
          if (ch[now][d]) now=ch[now][d],ret+=(1<<i); else now=ch[now][d^1];
        }
        return ret;
      }
    } trie;
    
    int main(){
      scanf("%d",&n);
      for (ri i=1;i<=n;i++) scanf("%d",&a[i]);
      for (ri i=1;i<=n;i++) sum1[i]=sum1[i-1]^a[i];
      for (ri i=n;i>=1;i--) sum2[i]=sum2[i+1]^a[i];
      trie.init();
      trie.clear();
      for (ri i=1;i<=n;i++) {
        trie.insert(sum1[i-1]);
        L[i]=trie.search(sum1[i]);
        L[i]=max(L[i],L[i-1]);
      }
      trie.clear();
      for (ri i=n;i>=1;i--) {
        trie.insert(sum2[i+1]);
        R[i]=trie.search(sum2[i]);
        R[i]=max(R[i],R[i+1]);
      }
      long long ret=0;
      for (ri i=1;i<n;i++) if (L[i]+R[i+1]>ret) ret=L[i]+R[i+1];
      cout<<ret<<endl;
    }
  • 相关阅读:
    python并发编程之IO模型
    协程与concurent.furtrue实现线程池与进程池
    网络编程之线程进阶
    多线程讲解
    网络编程之进阶2
    网络编程之进阶
    网络编程之进程
    函数复习之2
    函数复习
    深克隆和浅克隆
  • 原文地址:https://www.cnblogs.com/shxnb666/p/11279410.html
Copyright © 2011-2022 走看看