B4260 Codechef REBXOR
阿新 • • 發佈:2018-06-24
異或 瓶頸 pro www. 只需要 Go mem LG lse
真是6塊錢cpu(笑
爆炸入口
踹樹練習(汗
對於二進制異或和彈性,我們可以貪心的來做。
瓶頸在於快速貪心。
我們可以維護一個trie樹,儲存異或前綴和。每次在trie樹上貪心的跑。
正向and反向跑一次,就可以了
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int manx=4e+5;
int t[manx<<5][2],tail;
int l[manx],r[manx],a[manx];
void ins(int val)
{
int now=0;
for(int i=1<<30;i;i>>=1)
{
int c=(val&i) ? 1 : 0 ;
if(!t[now][c]) t[now][c]=++tail;
now=t[now][c];
}
return ;
}//插入
int find(int val)
{
int now=0,ans=0;
for(int i=1<<30;i;i>>=1)
{
int c=(val&i) ? 1 : 0;
if (t[now][c^1]) now=t[now][c^1],ans+=i;//每次根據二進制位,貪心的選擇路徑
else now=t[now][c];
}
return ans;
}
int main()
{
int n;
scanf("%d",&n);
int now=0;ins(0);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
now^=a[i];
ins(now);
l[i]=max(l[i-1 ],find(now));
}//正向掃一遍
memset(t,0,sizeof(t));now=0,tail=0;ins(0);
for(int i=n;i>=1;i--)
{
now^=a[i];
ins(now);
r[i]=max(r[i+1],find(now));//反向和一遍
}
int ans=-0x7fffffff;
for(int i=1;i<=n;i++)
ans=max(l[i]+r[i+1],ans);//這裏我們只需要保證不香蕉就可以了(汗
printf("%d",ans);
}
B4260 Codechef REBXOR