很顯然我們求出一組線性基來,如果有m個基,那麼可以構造n - m + 1個最大異或值
而對於線性基中的元素,除了最大的元素,我們用最大異或值異或掉每個元素累加進答案
而不是把線性基中的元素處理成乙個下三角矩陣!
#include #include #include #include #include #include #define enter putchar('\n')
#define space putchar(' ')
#define maxn 1000005
//#define ivorysi
#define pb push_back
#define mo 1000007
#define pii pair#define mp make_pair
using namespace std;
typedef long long int64;
templatevoid read(t &res)
while(c >= '0' && c <= '9')
res = res * f;
}templatevoid out(t x)
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}int n;
int64 a[60],b[60];
bool vis[60],has[60];
void solve()
}} }
int64 ans = 0;
for(int i = 1 ; i <= n ; ++i)
ans += a[i];
} }
int64 t = 0;
for(int i = 55 ; i >= 0 ; --i)
}ans += t;
for(int i = 55 ; i >= 0 ; --i)
out(ans);enter;
}int main()
51nod1312 最大異或和
基準時間限制 1 秒 空間限制 131072 kb 分值 320 有乙個正整數陣列s,s中有n個元素,這些元素分別是s 0 s 1 s 2 s n 1 現在你可以通過乙個操作來更新陣列。操作方法如下 選擇兩個不同的數i j 0 i,j 你可以進行任意多次操作,問最後生成的陣列s的元素和 sum s ...
51nod1312 最大異或和(線性基)
傳送門 先把線性基建出來 顯然其他所有數都可以湊成線性基的最大值 考慮怎麼讓線性基內和最大 手玩一下可以發現最優情況是最高位的都有,剩下每乙個基都少填乙個 include using namespace std const int rlen 1 20 1 inline chargc define i...
最大異或和
問題描述 給出n個整數,多組詢問求乙個給出的數與這n個數中的乙個數的最大異或的值。輸入格式 第一行乙個整數n,表示有個數字。第二行n個正整數。第三行乙個整數m,表示m個詢問。第四行m個整數,表示m個詢問的整數。輸出格式 共m行,對於每個詢問輸出最大的異或值。輸入樣例 43 5 6 7 31 4 7 ...