或在數學中的含義:乙個元素在集合a中或在集合b中,或的維恩圖如下:
而異或是不允許共存的,所以 a ^ b 的維恩圖如下:
同理對於 a ^ b ^ c 維恩圖:
異或運算
⊕fff
fttt
fttt
f1. 1-1000放在含有1001個元素的陣列中,只有唯一的乙個元素重複,找出這個重複的數字。要求不能使用輔助儲存空間並且陣列的每個元素只能訪問一次。
解法一:將這1001個元素加起來的和減去1+2+……+1000,所得的值就是重複的數字(資料過大容易溢位)。
解法二:異或
將1001個數全部異或得到的值再與1^2^……^1000的結果再次異或,這樣就避免了資料過大溢位的情況。
首先,異或運算滿**換律和結合律,即a^b = b^a,(a^b)^c = a^(b^c)。令重複的數字為n:
所以1 ^ 2 ^ … ^ n ^ n ^ … ^ 1000 = 1 ^ 2 ^ … ^ 1000 ^ (n ^ n) = 1 ^ 2 ^ … ^ 1000 ^ 0 = 1 ^ 2 ^ … ^ 1000(即序列中除了重複數字 n 以外所有數的異或。
如果令1 ^ 2 ^ … ^ 1000(序列中不包含n)的結果為t,那麼1 ^ 2 ^ … ^ 1000(序列中包含n)的結果就是 t^n,t ^ (t ^ n) = n。
2. 變形:乙個陣列存放若干整數,乙個數出現奇數次,其餘數均出現偶數次,找出這個出現奇數次的數。
解法與上面的解法二相同。
如樣例 1 ^ 1 ^ 1 ^ 2 ^ 2 ^ 3=1 ^ 3=2
因此如果長度為偶數那麼最後答案為小於等於的長度的偶數進行異或,如果為奇數那麼最後答案為小於長度的奇數進行異或。
對於這一部分你可以通過找規律得出答案 。規律為長度從2開始週期為8
第一組:2 2 6 7 0 0 8 9
第二組 :2 2 14 15 0 0 16 17
第三組 : 2 2 22 23 0 0 24 25
#includeusing namespace std;
typedef long long ll;
ll l,r,len,ans;
int main()else if(len==6||len==7)else if(len==4||len==5)else if(len==8||len==9)
printf("%lld",ans);
return 0;
}
參考文章 hdu5014 異或 找區間
題意 給出乙個由 這 個數字組成的序列 要求你給出另乙個序列有 組成,讓他們一一對應 異或相加的值最大 輸出最大值,和你給出的序列 思路 異或完要得到最大值,就應該要二進位制是互補的,如 我們的最大值是 所以我們首先要找到和 互補的值是多少,例如找到是 和 互補 那麼 和 互補 和 也互補 類推 然...
線段樹區間異或
題目描述 akn 覺得第一題太水了,不屑於寫第一題,所以他又玩起了新的遊戲。在遊戲中,他發現,這個遊戲的傷害計算有乙個規律,規律如下 擁有乙個傷害串,是乙個長度為 nnn 的只含字元 0 和字元 1 的字串。規定這個字串的首字元是第乙個字元,即下標從 111 開始。給定乙個範圍 l,r l,r l,...
異或 找規律 T44755 瀏覽器
窩第一次打洛咕月賽qaq.寫完t1就跑去幹別的了qaq.第二天發現評分是藍題,驚了orz 如果乙個數在二進位制表示下有奇數個1,先叫它奇數吧qaq,偶數同理 手玩一下你會發現,奇數 偶數結果一定符合要求,ans 1,其餘情況均不符合要求 所以只要翻譯一下題面求一下x i 陣列,統計一下x陣列中有多少...