• [BZOJ]4260: Codechef REBXOR


    题解:把前缀和丢进trie树 维护以i结尾的区间最大异或和pre[i]   把后缀和丢进tire树 维护以i起始的区间最大异或和suf[i]  然后枚举前半部分 查询后半部分最大值 我们可以通过st表来维护最大值 然后取max即可

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <cmath>
    #include <set>
    #include <map>
    #define mp make_pair
    #define pb push_back
    #define pii pair<int,int>
    #define link(x) for(edge *j=h[x];j;j=j->next)
    #define inc(i,l,r) for(int i=l;i<=r;i++)
    #define dec(i,r,l) for(int i=r;i>=l;i--)
    const int MAXN=4e5+10;
    const double eps=1e-8;
    #define ll long long
    using namespace std;
    struct edge{int t,v;edge*next;}e[MAXN<<1],*h[MAXN],*o=e;
    void add(int x,int y,int vul){o->t=y;o->v=vul;o->next=h[x];h[x]=o++;}
    ll read(){
        ll x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
        return x*f;
    }
    
    int n;
    int a[MAXN];
    typedef struct node{
        int ch[2];
    }node;
    node d[MAXN*32];
    int cnt,rt;
    void newnode(int &x){
        x=++cnt;d[x].ch[0]=d[x].ch[1]=0;
    }
    
    void insert(int x){
        int temp=rt;
        for(int i=30;i>=0;i--){
    	if(!d[temp].ch[((x>>i)&1)])newnode(d[temp].ch[((x>>i)&1)]);
    	temp=d[temp].ch[((x>>i)&1)];
        }
    }
    
    int query(int x){
        int temp=rt;int ans=0;
        for(int i=30;i>=0;i--){
    	int t=((x>>i)&1);
    	if(d[temp].ch[!t])ans+=(1<<i),temp=d[temp].ch[!t];
    	else temp=d[temp].ch[t];
        }
        return ans;
    }
    
    int pre[MAXN],suf[MAXN];
    int dp[MAXN][21],ma[MAXN];
    void St(){
        inc(i,2,n)ma[i]=ma[i/2]+1;
        inc(i,1,n)dp[i][0]=suf[i];
        inc(j,1,20){
    	for(int i=1;i+(1<<j)<=n+1;i++){
    	    dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
    	}
        }
    }
    
    int Max(int l,int r){
        int k=r-l+1;k=ma[k];
        return max(dp[l][k],dp[r-(1<<k)+1][k]);
    }
    
    int main(){
        n=read();
        inc(i,1,n)a[i]=read();
        cnt=0;newnode(rt);insert(0);
        int key=0;
        inc(i,1,n)key^=a[i],pre[i]=query(key),insert(key);
        cnt=0;newnode(rt);insert(0);
        key=0;
        dec(i,n,1)key^=a[i],suf[i]=query(key),insert(key);
        St();
        int ans=0;
        inc(i,1,n-1){
    	ans=max(ans,pre[i]+Max(i+1,n));
        }
        printf("%d
    ",ans);
        return 0;
    }
    

      

    4260: Codechef REBXOR

    Time Limit: 10 Sec  Memory Limit: 256 MB
    Submit: 2515  Solved: 1103
    [Submit][Status][Discuss]

    Description

    Input

    输入数据的第一行包含一个整数N,表示数组中的元素个数。
    第二行包含N个整数A1,A2,…,AN。
     
     

    Output

    输出一行包含给定表达式可能的最大值。
     

    Sample Input

    5
    1 2 3 1 2

    Sample Output

    6

     

  • 相关阅读:
    node的安装与配置
    linux下查看是否安装某个软件
    怎么把apk文件部署在云服务器上
    github怎么搜索!!!
    node.js搭建本地服务器的两种方式(anywhere和http-server)
    js中迭代方法
    yarn和npm的区别
    总结一下测试工程师学习的博客和网站
    我的周记1——”云想衣裳花想容"
    2019/11/22 再聊职业规划——5年后,你想成为怎样的人?
  • 原文地址:https://www.cnblogs.com/wang9897/p/10349565.html
Copyright © 2020-2023  润新知