• 【bzoj3261】最大异或和


    就是一个可持久化Trie.......

    #include<bits/stdc++.h>
    #define N 600005
    using namespace std;
    inline int read(){
        int f=1,x=0;char ch;
        do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
        do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
        return f*x;
    }
    int bin[30],n,m,a[N],b[N],rt[N];
    struct Trie{
        int cnt,c[N*24][2],sum[N*24];
        int ins(int x,int val){
            int tmp,y;tmp=y=++cnt;
            for(int i=23;i>=0;i--){
                c[y][0]=c[x][0];c[y][1]=c[x][1];
                sum[y]=sum[x]+1;
                int t=val&bin[i];t>>=i;
                x=c[x][t];c[y][t]=++cnt;y=c[y][t];
            }
            sum[y]=sum[x]+1;
            return tmp;
        }
        int query(int l,int r,int val){
            int tmp=0;
            for(int i=23;i>=0;i--){
                int t=val&bin[i];t>>=i;
                if(sum[c[r][t^1]]-sum[c[l][t^1]])
                tmp+=bin[i],r=c[r][t^1],l=c[l][t^1];
                else r=c[r][t],l=c[l][t];
            }
            return tmp;
        }
    }T;
    int main(){
        bin[0]=1;for(int i=1;i<=30;i++)bin[i]=bin[i-1]<<1;
        n=read();m=read();n++;
        for(int i=2;i<=n;i++)a[i]=read();
        for(int i=1;i<=n;i++)b[i]=b[i-1]^a[i];
        for(int i=1;i<=n;i++)rt[i]=T.ins(rt[i-1],b[i]);
        char s[10];int l,r,x;
        while(m--){
            scanf("%s",s);
            if(s[0]=='A'){
                n++;a[n]=read();b[n]=b[n-1]^a[n];
                rt[n]=T.ins(rt[n-1],b[n]);
            }
            else{
                l=read();r=read();x=read();
                printf("%d
    ",T.query(rt[l-1],rt[r],b[n]^x));
            }
        }
    }
  • 相关阅读:
    [JSOI2015]最小表示
    [洛谷2002]消息扩散
    [洛谷1726]上白泽慧音
    [CodeVS2822]爱在心中
    [POJ2186]Popular Cows
    [洛谷1991]无线通讯网
    [CQOI2009]跳舞
    [洛谷1342]请柬
    [USACO07JAN]Balanced Lineup
    [NOIp2003提高组]神经网络
  • 原文地址:https://www.cnblogs.com/zcysky/p/6910661.html
Copyright © 2020-2023  润新知