n個數任取進行異或,求最大值與嚴格次大值
第一次寫線性基www 弄出線性基后可以得到最大值。 接下來我們從小到大枚舉次大值在哪一個位與最大值不一樣,比如在i位,那么比i位高的要與最大值進行一樣的選擇,而第i位與最大值進行不一樣的選擇,比i位低的需要最大化,最后判定如果是嚴格比最大值小就可以退出,這一定是嚴格次大值。
#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=b;i--)using namespace std;int a[40],b[40];int i,j,k,l,t,n,m,ans,num;int main(){ scanf("%d",&n); fo(i,1,n){ scanf("%d",&t); fd(j,31,0){ if ((t&(1<<j))!=0){ if (!a[j]){ a[j]=t; break; } t^=a[j]; } } } fd(i,31,0){ if ((ans&(1<<i))==0){ ans^=a[i]; b[i]=1; } }新聞熱點
疑難解答