Rinne Loves Xor
鏈接:
來(lái)源:牛客網(wǎng)
時(shí)間限制:C/C++ 2秒,其他語(yǔ)言4秒 空間限制:C/C++ 262144K,其他語(yǔ)言524288K 64bit IO Format: %lld題目描述
輸入描述:
第一行一個(gè)整數(shù) N,表示數(shù)組 A 和 B 的長(zhǎng)度。
第二行 N 個(gè)整數(shù)表示數(shù)組 A。
第三行 N 個(gè)整數(shù)表示數(shù)組 B。
輸出描述:
輸出一行 N 個(gè)整數(shù),表示加密后的數(shù)組 C。
示例1
輸入
復(fù)制
輸出
復(fù)制
備注:
N≤105, ai≤109
題解:
本人也沒(méi)做出來(lái),看了其他題解,學(xué)到兩個(gè)方法
方法一
參考題解
一下為個(gè)人結(jié)合題解的理解
暴力做O(n2)肯定超時(shí)
題目已經(jīng)發(fā)式子給我們了,我們可以看出整個(gè)求解其實(shí)就是一個(gè)遞推過(guò)程。由已知推位置,之前推出的后面也不會(huì)再修改。
異或:相同為0,不同為非0
最麻煩的就是后面這個(gè)部分
這個(gè)累加式子我們可以拆開(kāi)
既然是異或,我們就用二進(jìn)制來(lái)考慮,a與b異或,我們也可以把a(bǔ)與b都分成二進(jìn)制,題目給的a的范圍小于1e9,也就是a二進(jìn)制最多為32位,所以這樣完全ok
兩個(gè)數(shù)位不同為1,如果當(dāng)前數(shù)字二進(jìn)制是1,前面這個(gè)數(shù)的這個(gè)位置的數(shù)如果是0,就可以貢獻(xiàn)出1;反之也是。如果兩個(gè)相同,則無(wú)法貢獻(xiàn)
我們用到一個(gè)sum數(shù)組
sum[i][0]
sum1[i][0] 表示前面的 a 數(shù)組中二進(jìn)制第 i 位為0 的數(shù)目
sum1[i][1]sum1[i][1] 表示前面的 a 數(shù)組中二進(jìn)制第 i 位為 1 的數(shù)目
sum2[i][0]sum2[i][0] 表示前面的 b 數(shù)組中二進(jìn)制第 i 位為 0 的數(shù)目
sum2[i][1]sum2[i][1] 表示前面的b 數(shù)組中二進(jìn)制第 i 位為 1 的數(shù)目
方法二:
個(gè)人感覺(jué)和上一個(gè)方法處理思想其實(shí)差不多
也是分成二進(jìn)制進(jìn)行對(duì)應(yīng)數(shù)位異或
式子:
Ci=Ci-1+ai xor b1+ai xor b2+…ai xor bi +ai-1 xor bi +…a1 xor bi
如果當(dāng)前位數(shù)j,之前出現(xiàn)過(guò)4次1,另外一組出現(xiàn)過(guò)3次0,那么后面計(jì)算這一位給答案貢獻(xiàn)就會(huì)是(4 * 3)<< j
pa[j][0/1]和pb[j][0/1]分別是a和b的在第j位之前0/1的數(shù)量
有個(gè)式子為
c[i] += (pa[j][0] * pb[j][1] + pa[j][1] * pb[j][0]) << j;
括號(hào)里就是相對(duì)應(yīng)數(shù)位的數(shù)進(jìn)行異或,而后面的<<j就是把這個(gè)數(shù)位的二進(jìn)制轉(zhuǎn)化成對(duì)應(yīng)的十進(jìn)制加給c
總結(jié)
以上是生活随笔為你收集整理的Rinne Loves Xor的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何用ultraiso制作一个启动盘ul
- 下一篇: 三分法讲解