zoukankan      html  css  js  c++  java
  • BZOJ-4260-Codechef REBXOR(trie树)

    Description

    Input

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

    Output

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

    Sample Input

    5
    1 2 3 1 2

    Sample Output

    6

    HINT

    满足条件的(l1,r1,l2,r2)有:(1,2,3,3),(1,2,4,5),(3,3,4,5)。

    对于100%的数据,2 ≤ N ≤ 4*105,0 ≤ Ai ≤ 109。

    Source

     

    题解

    自己trie树感觉不太会,练一练(都要NOIP考试了还在学0.0)

    其实很多xor的问题都是trie树(记得机房外面还有写着trie树——解决xor问题)

    那么这道题我们要怎么做呢?

    我们用b[i]表示从左到右,以i为结尾的最大异或和

    同理,另一个式子我们也可以这么做

     1 #include<bits/stdc++.h>
     2 #define N 400005
     3 using namespace std;
     4 int n,cnt,len,Max;
     5 int p[31];
     6 int a[N],s[N],M[N];
     7 struct node{
     8     int l,r,val;
     9 }tr[31*N];
    10 void get(int x){
    11     len=0;
    12     while (x){
    13         p[++len]=x%2;
    14         x>>=1;
    15     }
    16 }
    17 void insert(int x){
    18     int y=1;
    19     for (int i=31;i>len;i--){
    20         if (!tr[y].l) tr[y].l=++cnt; 
    21         y=tr[y].l;
    22     }
    23     for (int i=len;i>=1;i--)
    24         if (p[i]){
    25             if (!tr[y].r) tr[y].r=++cnt;
    26             y=tr[y].r;
    27         } else{
    28             if (!tr[y].l) tr[y].l=++cnt ;
    29             y=tr[y].l;
    30         }
    31     tr[y].val=x;
    32 }
    33 int find(int x){
    34     int y=1;
    35     for (int i=31;i>len;i--)
    36         y=tr[y].r?tr[y].r:tr[y].l;
    37     for (int i=len;i>=1;i--)
    38         if (p[i])
    39             y=tr[y].l?tr[y].l:tr[y].r;
    40         else
    41             y=tr[y].r?tr[y].r:tr[y].l;
    42     return tr[y].val;
    43 }
    44 int main(){
    45     scanf("%d",&n);
    46     for (int i=1;i<=n;i++)
    47         scanf("%d",&a[i]);
    48     int ans;
    49     cnt=1;
    50     for (int i=1;i<=n;i++){
    51         s[i]=s[i-1]^a[i];
    52         get(s[i]);
    53         ans=s[i]^find(s[i]);
    54         M[i]=max(M[i-1],ans);
    55         insert(s[i]);
    56     }
    57     memset(tr,0,sizeof(tr));
    58     memset(s,0,sizeof(s));
    59     cnt=1;
    60     for (int i=n;i>=1;i--){
    61         s[i]=s[i+1]^a[i];
    62         get(s[i]);
    63         ans=(s[i]^find(s[i]))+M[i-1];
    64         if (ans>Max) Max=ans;
    65         insert(s[i]);
    66     }
    67     printf("%d
    ",Max);
    68     return 0;
    69 } 
    View Code
  • 相关阅读:
    python之read()方法
    python之高阶函数
    python之lambda表达式的应用
    DevExpress.XtraGrid.view.gridview 说明文
    C# SQL时间格式
    GridControl自动定位至符合条件的行
    用sql命令修改数据表
    用C#编程从数据库中读取图片数据导进Excel文件的方法(如何从数据库中读取保存的文件,直接打开,中间不保存到本地)
    DevExpress中GridControl的属性设置及动态绑定数据和全选取消全选
    C# 导出数据到Excel模板中
  • 原文地址:https://www.cnblogs.com/zhuchenrui/p/7805864.html
Copyright © 2011-2022 走看看