Gray碼陣列中是否存在4個元素的異或結果為0?

2021-06-07 12:59:29 字數 2076 閱讀 1924

問題:給定乙個陣列,該陣列中的相鄰的兩個元素其二進位制**只在某個位上不同(類似於gray碼),問能否在該陣列中找到四個數,這四個數的異或的值是0。

限制:陣列中的每個元素的取值範圍是[0,2^64),陣列的個數n的取值範圍是[4,100000]

**:codechef  

關鍵字:抽屜原理/鴿籠原理

分析

定義1具有上述性質的陣列我們稱為a陣列

性質1 a陣列的相鄰的元素異或之後的值只有乙個bit為1。

性質2 如果存在i,使得b[i] = b[i+1],那麼a[i] = a[i+2]。

定義2計算a陣列中任意兩個相鄰的數的異或的值,可以匯出乙個新的陣列,該陣列稱為b陣列。

定義3計算a陣列(0-index)中任意偶數index的元素與其後乙個元素的異或的值,可以匯出乙個新的陣列,該陣列稱為c陣列。顯然c陣列是b的乙個子陣列。

性質3 如果a陣列有n個元素,則b陣列有n-1個元素,c陣列有n/2個元素。

性質4 如果存在著i + 1 < j,使得b[i] == b[j],則(i,i+1,j,j+1)是一組解。對於c陣列亦然。

性質5 b陣列中的每個元素的二進位制表示中只有乙個bit是1。對於c陣列亦然。

引理1 當n >= 130時,a陣列必定有4個不同的元素,使得其異或的結果為0。

因為當n >= 130時,此時c陣列的元素個數至少有65個。由於c陣列元素的二進位制表示只有乙個bit是1,因此最多有64個不同的c元素。根據抽屜原理,即c陣列中至少有兩個數相同。 再根據性質4,必然有解。

引理2 當n >= 68時,a陣列必定有4個不同的元素,使得其異或的結果為0。

因為n >= 68,所以b陣列的元素個數至少有n-1 >= 67個,由於b陣列元素的二進位制表示只有乙個bit是1,因此最多有64個不同的b元素,因此以下三種情況必居其一

(1)存在著i < j < k < p,使得b[i] == b[j] == b[k] == b[p],此時i + 1 <= j < k,根據性質4有解

(2)存在著i< j < k,p < q,使得b[i] == b[j] == b[k],b[p] == b[q],此時i + 1 <= j < k,根據性質4有解

(3)存在著i < j,p < q,u < v(i < p < u),使得b[i] == b[j],b[p] == b[q],b[u] == b[v]

(3.1)如果i + 1 < j 或 p + 1 < q 或 u + 1 < v,則根據性質4有解

(3.2)如果i + 1 == j且p + 1 == q且u + 1 == v 且i + 1 == p,則(i,i+2,p,p+2)是一組解

(3.3)如果i + 1 == j且p + 1 == q且u + 1 == v 且i + 2 < p,則(i,i+2,p,p+2)是一組解

(3.4)如果i + 1 == j且p + 1 == q且u + 1 == v 且p + 1 == u,則(p,p+2,u,u+2)是一組解

(3.5)如果i + 1 == j且p + 1 == q且u + 1 == v 且p + 2 < u,則(p,p+2,u,u+2)是一組解

(3.6)如果i + 1 == j且p + 1 == q且u + 1 == v 且i + 2 == p 且 p + 2 == u,則(i,i+2=p,p+2=u,u+2)是一組解

即當n >= 68時必定有解

方案一:n^4演算法。

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

}} }

return false;

方案二:n^3*logn演算法。

std::sort(a.begin(),a.end());

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

}} return false;

方案三:n^2或者n^2*logn演算法

陣列中是否存在某項

是否存在 按照屬性值,查詢物件 如果不存在返回 1 function findelem arraytosearch,attr,val return 1 js查詢陣列中是否存在某個元素 1 函式方法定義 function contains arr,obj return false var arr ne...

如何判斷乙個物件是否為空,陣列中是否存在某值

判斷物件是否為空,如下 方法一 判斷是否存在屬性 var obj for var key in obj 方法二 判斷其對應的json var obj var json1 json.stringify obj console.log json1 方法三 通過object.keys 該方法會遍歷物件中的...

C 中怎麼判斷乙個陣列中是否存在某個陣列值

用for,foreach是可以,這些就不用說了 用正規表示式也可以,但是針對這個問題靈活性差,畢竟某個數字是變化的,必須改變正規表示式.我採用的是把陣列放到arraylist裡,用它自帶的方法便可.static void main string args 初始化陣列 arraylist ar new...