BZOJ 4269: 再見Xor(線性基+貪心)
阿新 • • 發佈:2019-02-02
space 思路 class print xor cstring for tchar stream
傳送門
解題思路
首先最大值很好求,直接造出來線性基貪心即可。次大值的話就枚舉哪一位跟最大值不同,然後異或上即可。
代碼
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const int N=100005; inline int rd(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)) f=ch==‘-‘?0:1,ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-‘0‘,ch=getchar(); return f?x:-x; } int n,Ans1,b[35],Ans2; bool vis[35]; inline void Insert(int x){ for(int i=31;~i;i--) if((x&(1<<i))) { if(!b[i]) b[i]=x; x^=b[i]; } } inline void get_Ans(){ for(int i=31;~i;i--) if(b[i] && (Ans1^b[i])>Ans1) Ans1^=b[i]; for(int i=31;~i;i--) if((Ans1^b[i])<Ans1) Ans2=max(Ans2,Ans1^b[i]); } int main(){ n=rd(); int x; for(int i=1;i<=n;i++) x=rd(),Insert(x); get_Ans(); printf("%d %d\n",Ans1,Ans2); return 0; }
BZOJ 4269: 再見Xor(線性基+貪心)