xor clique(按位異或):
傳送門:
準備:異或:參加運算的兩個資料,按二進位制位進行「異或」運算。
運算規則:0^0=0, 0^1=1, 1^0=1, 1^1=0;
即:參加運算的兩個物件,如果兩個相應位為「異」,則該位結果為1,否則為0;
題意:有乙個a1到an的序列,問能不能找到乙個長度為s的序列,對於在s裡面的任意的i,j滿足ai⊕aj
解題思路:
多找幾組資料就會發現若想異或結果小於最小值,只需要兩個數二進位制形式位數相同, 即二進位制前面第一位都為1,進行異或運算後就會第一位變為0,自然比原來兩個數都小 所以只需要將序列中所有數的二進位制形式位數進行統計即可(學長說二進位制運算一般找最高位是常用的方法)
以下為ac**:
1view code/**/
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 }
以下為超時**:
1 #include2view codeusing
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 }
詳解「 按位與 按位或 按位異或」
按位與 按位或 按位異或 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的二進位制補碼...