先是累加(xor,一开始真写成+了,结果查了那么久。。。。)
然后作差,感觉类似单调DP,有一类单调DP使用平衡树的,但这个不需要用平衡树,只要用tire树。
考虑到0/1性和最坏情况下树的密集度,于是写了静态完全二叉树。。。。
于是MLE,然后降低maxa,RT,同时降低maxt,WA。
然后左右斟酌提交多次,MLE或WA。
最后卡常数,把树的前maxt-1层用bool,最后一层用int。。。。。AC了。。。。。
被改残的代码
/**//*
USER:zyn19961
TASK:cowxor
LANG:C++
*/
#include<cstdio>
#include<cstring>
#include<fstream>
#include<iostream>
#include<algorithm>
using namespace std;
//
#define MM(a,i) memset((a),i,sizeof(a))
#define FOR(i,l,r) for (int i=(l);i<=(r);i++)
#define DFOR(i,r,l) for (int i=(r);i>=(l);i--)
//
typedef long long int64;
const int INF=~0U>>2;
const int maxa=(8388608+2)/2;
const int maxt=20;
const int maxn=100001;
//
ifstream fin("cowxor.in");
ofstream fout("cowxor.out");
//
int bit[maxt+1];
bool tree[maxa];
int treen[maxa/2];
int aa[maxn];
int ans=0,ansa=1,ansb=1;
void insert(int i);//left:0 right:1
void match(int i);
void show();
int main(){
MM(bit,0),MM(tree,0),MM(aa,0);
int n,t;
fin>>n;
bit[0]=1;
FOR(i,1,maxt)bit[i]=bit[i-1]*2;
aa[0]=0;FOR(i,1,n){
fin>>aa[i];
if(aa[i]>ans)ans=aa[i],ansa=ansb=i;
aa[i]^=aa[i-1];
}
FOR(i,0,n){
match(i);
insert(i);
}
fout<<ans<<" "<<ansa<<" "<<ansb<<"\n";
fin.close();
fout.close();
return 0;
}
void insert(int i){
int p=1,s=aa[i];
DFOR(t,maxt,0){
tree[p]=1;
if(s&bit[t])p=p*2+1;else p=p*2;
}tree[p]=1;
if(s==0)tree[p]=-1;
else treen[p-maxa/2]=i;
}
void match(int i){
int anss=0,q,p=1,s=aa[i];
DFOR(t,maxt,0){
q=(s&bit[t])/bit[t];
q^=1;
if(q)if(tree[p*2+1])p=p*2+1,anss+=bit[t];
else p*=2;
else if(tree[p*2])p*=2,anss+=bit[t];
else p=p*2+1;
}
if(anss>ans)ans=anss,ansa=treen[p-maxa/2]+1,ansb=i;
}
void show(){
FOR(i,0,maxt+1){
FOR(j,1<<i,(1<<(i+1))-1){
printf("%d ",tree[j]);
}
printf("\n");
}
}
USACO的空间限制到底是多少????