1. 程式人生 > >B4260 Codechef REBXOR

B4260 Codechef REBXOR

異或 瓶頸 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