BZOJ3261【可持久化Tire】

来源:互联网 发布:博盈软件 编辑:程序博客网 时间:2024/06/07 00:44

可以运用前缀异或和的思想.将问题转化成在包含一个区间的Tire上贪心求解.

/* I will wait for you */ #include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<ctime>#include<algorithm>#include<iostream>#include<fstream>#include<vector>#include<queue>#include<deque>#include<set>#include<map>#include<string>#define make make_pair#define fi first#define se second using namespace std; typedef long long LL;typedef unsigned long long ULL;typedef pair<int,int> PII; const int maxn=1000010;const int maxm=1010;const int maxs=23;const int INF=1<<29;const int P=1000000007;const double error=1e-9; struct node{ node* son[2];int sum; }*su[maxn]; node* insert(node*o,int val,int c){    node* p=new node();    p->sum=o?o->sum+1:1;    if(c>=0)    {        int t=(val&(1<<c))>>c;        p->son[t]=insert(o?o->son[t]:0,val,c-1);        p->son[t^1]=o?o->son[t^1]:0;    }    return p;} int query(node* l,node* r,int val,int c){    int t=(val&(1<<c))>>c;    int ls=l&&l->son[t^1]?l->son[t^1]->sum:0;    int rs=r&&r->son[t^1]?r->son[t^1]->sum:0;         int ans=(rs>ls)*(1<<c);        if(c)    {        if(rs>ls) ans+=query(l?l->son[t^1]:0,r?r->son[t^1]:0,val,c-1);        else ans+=query(l?l->son[t]:0,r?r->son[t]:0,val,c-1);    }    return ans;} int main(){    int n,q,last=0;scanf("%d%d",&n,&q);    n++;su[1]=insert(su[0],0,maxs);    for(int i=2,c;i<=n;i++) scanf("%d",&c),su[i]=insert(su[i-1],last=last^c,maxs);     for(int i=1;i<=q;i++)    {        char s[10];int c,x,y;scanf("%s",s);        if(s[0]=='A') scanf("%d",&c),n++,su[n]=insert(su[n-1],last=last^c,maxs);        if(s[0]=='Q') scanf("%d%d%d",&x,&y,&c),printf("%d\n",query(su[x-1],su[y],last^c,maxs));    }     return 0;}

0 0
原创粉丝点击