LOJ114 k大異或和

2022-05-05 17:27:10 字數 1043 閱讀 4474

傳送門

(vjudge和hdu也有但是我覺得loj好看!而且限制少!)

不過本題描述有誤,應該是k小。

首先我們需要對線性基進行改造。需要把每一位改造成為,包含最高位的能異或出來的最小的數。

為啥呢?因為如果不滿足這個條件的話,那麼在之後的異或過程中,大的數反而會被小的數異或的更小。

滿足了上述性質之後,我們就能知道,首先高位的1一定比低位的1更能使異或和變大,而低位的1一定能使異或和變大。那麼我們先把線性基中所有元素壓入棧,之後把k二進位制拆分,異或上對應的位置的值即可。

#include#include#include#include#include#include#define rep(i,a,n) for(register int i = a;i <= n;i++)

#define per(i,n,a) for(register int i = n;i >= a;i--)

#define enter putchar('\n')

#define pr pair#define mp make_pair

#define fi first

#define sc second

#define i inline

using namespace std;

typedef long long ll;

const int m = 20005;

const int n = 10000005;

ll read()

while(ch >='0' && ch <= '9') ans = ans * 10 + ch - '0',ch = getchar();

return ans * op;

}ll p[65],k,x,cnt,f[65];

int t,n,q;

void insert(ll x)

x ^= p[i];

}}void rebuild()

}ll calc(ll k)

int main()

return 0;

}

LOJ 114 k 大異或和

loj 114 k 大異或和 試題描述 這是一道模板題。給由 n個數組成的乙個可重集 s,每次給定乙個數 k,求乙個集合 t s,使得集合 t在 s的所有非空子集的不同的異或和中,其異或和 t1 xor t2 xor xor t t 是第 k小的。輸入 第一行乙個數 n。第二行 n個數,表示集合 s...

LOJ114 K大異或和 線性基

給出乙個n 1 e5 n leq1e5 n 1e 5的可重集合,求這個集合的第k kk小異或和。首先直接對n nn個數消元,然後把高位之後的1 11也盡可能消去,取出所有的非零的基向量。特判掉可能為0 00的情形 當且僅當非零基向量小於元素個數 剩下的t tt個基向量共有2t 12 1 2t 1 種...

LOJ 114 K大異或和 線性基

題目鏈結 需要注意如果線性基中表示的向量不足n個,說明一定存在一組向量滿足線性相關關係,即存在xor和為0的情況。這樣要使k減1。判斷是k 1 include include define gc getchar define maxin 100000 define gc ss tt tt ss in...