Description 給定一些數,求這些數中兩個數的異或值最大的那個值 Input 多組數據。第一行為數字個數n,1 <= n <= 10 ^ 5。接下來n行每行一個32位有符號非負整數。 Output 任意兩數最大異或值 Sample Input 3 3 7 9 Sample Output 14 ...
Description
給定一些數,求這些數中兩個數的異或值最大的那個值
Input
多組數據。第一行為數字個數n,1 <= n <= 10 ^ 5。接下來n行每行一個32位有符號非負整數。
Output
任意兩數最大異或值
Sample Input
3 3 7 9
Sample Output
14
Hint
Source
CSGrandeur的數據結構習題
毒瘤老師給學弟們出這種題真的好麽qwq。
難不成想讓他們現場構造01trie這種數據結構?霧
#include<cstdio> #include<algorithm> #include<cmath> #define LL long long using namespace std; const int MAXN = 51, INF = 1e9 + 10; const double eps = 1e-8; inline int read() { char c = getchar();int x = 0,f = 1; while(c < '0' || c > '9'){if(c == '-')f = -1;c = getchar();} while(c >= '0' && c <= '9'){x = x * 10 + c - '0',c = getchar();} return x * f; } int N, M; LL a[10001][1001]; void Pivot(int l, int e) { double t = a[l][e]; a[l][e] = 1; for(int i = 0; i <= N; i++) a[l][i] /= t; for(int i = 0; i <= M; i++) { if(i != l && abs(a[i][e]) > eps) { t = a[i][e]; a[i][e] = 0; for(int j = 0; j <= N; j++) a[i][j] -= a[l][j] * t; } } } bool simplex() { while(1) { int l = 0, e = 0; double mn = INF; for(int i = 1; i <= N; i++) if(a[0][i] > eps) {e = i; break;} if(!e) break; for(int i = 1; i <= M; i++) if(a[i][e] > eps && a[i][0] / a[i][e] < mn) mn = a[i][0] / a[i][e], l = i; Pivot(l, e); } return 1; } int main() { // freopen("a.in", "r", stdin); srand(19260817); N = read(); M = read(); for(int i = 1; i <= N; i++) a[0][i] = read(); for(int i = 1; i <= M; i++) { int K = read(); while(K--) { int S = read(), T = read(); for(int j = S; j <= T; j++) a[i][j] = 1; } int C = read(); a[i][0] = C; } simplex(); printf("%lld", -a[0][0]); return 0; }