90分#11过不了求调
查看原帖
90分#11过不了求调
907773
zzb202203170222楼主2023/7/16 13:12
#include<bits/stdc++.h>
#define L(i,j,k) for(int i=j;i<=k;i++)
#define R(i,j,k) for(int i=j;i>=k;i--) 
#define ll long long 
#define fi first 
#define se second
using namespace std;
const int maxn=6e5+7;
int trie[maxn*25][2];    //数组定义字典树,存储下一个字符的位置
int ver[maxn*25],root[maxn],s[maxn];     //以某一字符串为前缀的单词的数量
int pos = 1;

void insert(int x,int y,int z){   
    ver[x]=z;
    for(int k=23;k>=0;k--){
        int c=s[z]>>k&1;
        trie[x][!c]=trie[y][!c];
        trie[x][c]=++pos;
        x=trie[x][c];y=trie[y][c];
        ver[x]=z;
    }
}
int query(int x,int l,int v){
    int res=0;
    for(int k=23;k>=0;k--){
        int c=v>>k&1;
        if(ver[trie[x][!c]]>=l)
            x=trie[x][!c],res+=1<<k;
        else x=trie[x][c];
    }
    return res;
}
int main(){
    int n,m;scanf("%d%d",&n,&m);
    ver[0]=-1;
    root[0]=++pos;
    insert(root[0],0,0);
    L(i,1,n) {
        int x;scanf("%d",&x);
        s[i]=s[i-1]^x;root[i]=++pos;
        insert(root[i],root[i-1],i);
    }
    for(int i = 1; i <= m; i ++){
        
           char c = getchar();if(c=='\n'||c==' ') c=getchar(); 
           if(c=='\n'||c==' ') c=getchar(); 
           
        if(c == 'A'){
            int x;scanf("%d",&x);
            s[n + 1] = s[n] ^ x,n ++,root[n] = ++pos;
            insert(root[n ],root[n-1],n);
        }else{int l,r,x;
           scanf("%d%d%d",&l,&r,&x);
            printf("%d\n",query(root[r-1],l-1,x ^ s[n]));
        }
    }

}
2023/7/16 13:12
加载中...