bzoj3261

xor有一个很重要的性质就是A xor B xor B=A
所以这道题求[l,r]中p,使a[p] xor a[p+1] xor ... xor a[N] xor x 最大
就是=最大化a[1] xor ……a[n] xor x xor a[1] xor a[2] xor ……a[p-1]
令b[i]=a[1] xor a[2] xor ……a[i]
则最大化b[p] xor b[n] xor X p∈[l-1,r-1] 
抛开区间,求b[p] xor Y的最大值我们需要用到trie树
由于是区间修改,所以要求我们对trie进行可持久化
类比主席树,我们对每个i都建立一棵trie树,不同的节点增开空间
在区间询问的时候,如果两棵树指向同一个节点,说明这一位上的值是不能取的,否则就按trie的贪心做
感觉可持久化就是对历史信息尽可能的保留,对新的值新开空间

 1 var son:array[-1..30000010,0..1] of longint;
 2     i,t,x,l,r,n,m:longint;
 3     b,root:array[-1..610000] of longint;
 4     ch:char;
 5 
 6 procedure add(j,x:longint);
 7   var i,a,b,y:longint;
 8   begin
 9     a:=root[j-1];
10     b:=root[j];
11     for i:=23 downto 0 do
12     begin
13       y:=x and (1 shl i);
14       if y>0 then y:=1;
15       inc(t);
16       son[b,y]:=t;  //类比主席树
17       son[b,1-y]:=son[a,1-y];
18       a:=son[a,y];
19       b:=son[b,y];
20     end;
21   end;
22 
23 function ask(l,r,x:longint):longint;
24   var y,i,a,b:longint;
25   begin
26     a:=root[l];
27     b:=root[r];
28     ask:=0;
29     for i:=23 downto 0 do
30     begin
31       y:=x and (1 shl i);
32       if y>0 then y:=1;
33       if (son[b,1-y]=0) or (son[b,1-y]=son[a,1-y]) then  //判断这位在区间内是否存在
34       begin
35         a:=son[a,y];
36         b:=son[b,y];
37       end
38       else begin
39         ask:=ask+1 shl i;
40         a:=son[a,1-y];
41         b:=son[b,1-y];
42       end;
43     end;
44   end;
45 
46 begin
47   readln(n,m);
48   b[0]:=0;
49   t:=1;
50   root[0]:=1;
51   x:=1;
52   for i:=23 downto 0 do
53   begin
54     inc(t);
55     son[x,0]:=t;
56     x:=t;
57   end;
58   for i:=1 to n do
59   begin
60     read(x);
61     b[i]:=b[i-1] xor x;
62     inc(t);
63     root[i]:=t;
64     add(i,b[i]);
65   end;
66   readln;
67   for i:=1 to m do
68   begin
69     read(ch);
70     if ch='A' then
71     begin
72       readln(x);
73       inc(n);
74       b[n]:=b[n-1] xor x;
75       inc(t);
76       root[n]:=t;
77       add(n,b[n]);
78     end
79     else begin
80       readln(l,r,x);
81       x:=x xor b[n];
82       writeln(ask(l-2,r-1,x));
83     end;
84   end;
85 end.
86 
87  
View Code
原文地址:https://www.cnblogs.com/phile/p/4473054.html