奶牛异或
奶牛异或
https://ac.nowcoder.com/acm/problem/22998
做法:01字典树
思路:
- 这一题和The XOR Largest Pair思路很像,唯一不同的是这题求的是一段连续区间的最大值,并且还要维护区间的左端点和右端点.所以我们只需存每个连续区间的右端点.并且上个区间的右端点+1即为所求区间的左端点.
代码
#include <bits/stdc++.h> using namespace std; #define pb push_back #define mp(aa,bb) make_pair(aa,bb) #define _for(i,b) for(int i=(0);i<(b);i++) #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define per(i,b,a) for(int i=(b);i>=(a);i--) #define mst(abc,bca) memset(abc,bca,sizeof abc) #define X first #define Y second #define lowbit(a) (a&(-a)) typedef long long ll; typedef pair<int,int> pii; typedef unsigned long long ull; typedef long double ld; const int N=1e5+10; const int INF=0x3f3f3f3f; const int mod=1e9+7; const double eps=1e-6; int ans=-1,a,ed[N*32],temp; int n,l,r; struct Trie { int nex[N*32][2],cnt=0; void insert(int x,int pp) { int p = 0; for (int i = 30; i >= 0; i--) { int c = x>>i&1; if (!nex[p][c]) nex[p][c] = ++cnt; p = nex[p][c]; } ed[p]=pp; } void find(int x,int pp) { int p = 0,res = 0; for (int i =30; i >= 0; i--) { int c = x>>i&1; if(nex[p][c^1]) p=nex[p][c^1],res|=(1<<i); else p=nex[p][c]; } if(res>ans) ans=res,l=ed[p]+1,r=pp; } } t; int main() { ios::sync_with_stdio(0); cin.tie(0); #ifdef DEBUG freopen("F:/laji/1.in", "r", stdin); // freopen("F:/laji/2.out", "w", stdout); #endif cin>>n; t.insert(0,0); rep(i,1,n){ cin>>a; temp^=a; t.find(temp,i); t.insert(temp,i); } cout<<ans<<" "<<l<<" "<<r<<"\n"; return 0; }
牛客每日一题 文章被收录于专栏
水