响应式中文网站欣赏,机wordpress,怎么更换网站图片,广州软件园软件开发公司题目大意#xff1a; 给出一个数列#xff0c;求最大区间异或和。异或和相同时取终点最靠前的#xff0c;仍相同取最短的。简单题解#xff1a;先求出前缀和。对每个数#xff0c;将其前一项的前缀和插入0-1树中。然后在该树中#xff0c;从高位到低位#xff08;贪心思… 题目大意 给出一个数列求最大区间异或和。 异或和相同时取终点最靠前的仍相同取最短的。 简单题解 先求出前缀和。 对每个数将其前一项的前缀和插入0-1树中。 然后在该树中从高位到低位贪心思想查询与当前前缀和的各位尽可能不同的前缀。 然后更新答案。 我的代码 1 /*2 ID:t-x.h13 LANG:C4 TASK:cowxor5 */6 #includecstdio7 #includecstring8 FILE *fifopen(cowxor.in,r),*fofopen(cowxor.out,w);9 const int MAXn1000009,MAXt9*MAXn;
10 int a[MAXn];
11 int next[MAXt][2],pos[MAXt],num1;
12 int main()
13 {
14 int n,i,j,k,ans0,ansx1,ansy1;
15 fscanf(fi,%d,n);
16 for(i1;in;i)
17 {
18 fscanf(fi,%d,ai);
19 a[i]^a[i-1];
20
21 //插入前一项
22 for(k1,j20;j0;--j)
23 {
24 if(!next[k][(a[i-1]j)1])
25 next[k][(a[i-1]j)1]num;
26 pos[ knext[k][(a[i-1]j)1] ]i;
27 }
28
29 //查询当前项
30
31 for(k1,j20;j0;--j)
32
33 if(next[k][!( (a[i]j)1 )])
34 knext[k][!( (a[i]j)1 )];
35 else
36 knext[k][(a[i]j)1];
37 if(pos[k] (a[i]^a[pos[k]-1])ans)
38 ansa[i]^a[pos[k]-1],ansxpos[k],ansyi;
39 }
40 fprintf(fo,%d %d %d\n,ans,ansx,ansy);
41 fclose(fi);
42 fclose(fo);
43 return 0;
44 } 转载于:https://www.cnblogs.com/txhwind/archive/2012/08/18/2645374.html