XOR Clique(按位異或)

2022-05-29 21:27:09 字數 1361 閱讀 8680

xor clique(按位異或):

傳送門:

準備:異或:參加運算的兩個資料,按二進位制位進行「異或」運算。

運算規則:0^0=0,   0^1=1, 1^0=1,    1^1=0;

即:參加運算的兩個物件,如果兩個相應位為「異」,則該位結果為1,否則為0;

題意:有乙個a1到an的序列,問能不能找到乙個長度為s的序列,對於在s裡面的任意的i,j滿足a​i​​⊕a​j​​

解題思路:

多找幾組資料就會發現若想異或結果小於最小值,只需要兩個數二進位制形式位數相同, 即二進位制前面第一位都為1,進行異或運算後就會第一位變為0,自然比原來兩個數都小 所以只需要將序列中所有數的二進位制形式位數進行統計即可(學長說二進位制運算一般找最高位是常用的方法)

以下為ac**:

1

/**/

2 # include 3

using

namespace

std;

4 typedef long

long

ll;5

6const

int inf = 0x3f3f3f3f;7

const

int maxn = 40;///

用來記錄路最高位的值,2的30次方就可以達到1e9

8int a[maxn];///

用來記錄某一最高位所包含的數有幾個910

11int bt(int

x)12

19return cnt;///

返回最高位20}

2122

intmain()

2338 printf("

%d\n

", ans);39}

40return0;

41 }

view code

以下為超時**:

1 #include2

using

namespace

std;

3int

main()

4;///

相當於建了乙個桶來標記

11 scanf("

%d", &n);

12int k=0;13

for (int i = 0; i < n; ++i)

1422 a[sum]++;23}

24for(int i=0;i<10000;i++)///

這樣遍歷,無用迴圈做的次數太多了,所以超時

2528 printf("

%d\n

",k );29}

30return0;

31 }

view code

詳解「 按位與 按位或 按位異或」

按位與 按位或 按位異或 1.按位與運算 按位與運算子 是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 否則為0。參與運算的數以補碼方式出現。例如 9 5可寫算式如下 00001001 9的二進位制補碼 00000101 5的二進位制補碼 0000...

2019 9 02 按位或,按位與, 按位異或

a b a a b a 或者 b 只要有乙個為 1,那麼,a 的最終結果就為 1 a b a a b a 和 b 二者必須都為 1,那麼,a 的最終結果才為 1 a b a a b 當且僅當 a 和 b 的值不一致時,a 的最終結果才為1,否則為0 計算時,先把其化為二進位制數 如 5 0101 3...

位與 按位或 按位異或 運算

1.按位與運算 按位與運算子 是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 否則為0。參與運算的數以補碼方式出現。例如 9 5可寫算式如下 00001001 9的二進位制補碼 00000101 5的二進位制補碼 00000001 1的二進位制補碼...