小明和安琪是好朋友。最近,他們的談話被一家偵探機構監控,所以他們想將他們的談話內容進行加密處理。
於是,他們發明了一種新的加密方式。每條資訊都被編譯成二進位制數b(明文),其長度為n。
然後該資訊被寫下k次,每次向右移動0,1,…,k-1位。
例如:b = 1001010,k=4
1001010
1001010
1001010
1001010
然後對每一列進行異或操作,並且把最終所得的結果記錄下來,我們將該數稱為s(密文)。
例如上述例子的結果為:1110100110。
最後,將編碼的資訊s和k傳送給安琪。
小明已經實現了這種編碼的加密過程,但他要求安琪寫乙個程式去實現這種編碼的解密過程,你能幫助安琪實現解密過程嗎?
輸入格式:
第一行輸入兩個整數n
和k
第二行輸入乙個二進位制字串s
,長度是n + k - 1
輸出格式:
輸出明文b
資料範圍
1<=n<=10^6思路:1<=k<=10^6
首先,通過給出的示例,分析壓縮的規律,從壓縮的規律中反推出解壓的演算法。
首先分析壓縮的過程:
0 = 0
1 = 1 ^ 0
1 = 0 ^ 1 ^ 0
0 = 0 ^ 1 ^ 0 ^ 1
0 = 1 ^ 0 ^ 1 ^ 0
1 = 0 ^ 1 ^ 0 ^ 0
0 = 1 ^ 0 ^ 0 ^ 1
1 = 0 ^ 0 ^ 1
1 = 0 ^ 1
1 = 1
將要求解的明文串設定為:abcdefg
將壓縮後的密文串設定為:hijklmnopq
從新分析壓縮過程可得到如下:
q = g
p = f ^ g
o = e ^ f ^ g
n = d ^ e ^ f ^g
m = c ^ d ^ e ^ f
l = b ^ c ^ d ^ e
k = a ^ b ^ c ^ d
j = a ^ b ^ c
h = a
將公式a ^ b = c ⇒ a = b ^ c
代入,可推斷出:
g = q
f = g ^ p = p ^ q
e = o ^ f ^ g = o ^ p ^ q ^ q = o ^ p
d = n ^ e ^ f ^ g = ... = n ^o
c = m ^ d ^ e ^ f = m ^ n ^ o ^ o ^ p ^ p ^ q = m ^ n ^ q
b = l ^ c ^ d ^ e = l ^ m ^ p
a = k ^ b ^ d ^ d = k ^ l ^ o
可以推斷出規律:
public
class
main
res[0]
= s1[0]
;for
(int i =
1;i < k; i++
)for
(int i = k;i < n; i++
)for
(int i =
0;i < res.length; i++)}
}
位元組跳動2019筆試題
小明國慶節來北京玩,北京有n個景點,第 i 個景點的評分用a i 表示,兩個景點i,j之間的距離為j i j i 小明一天只能遊玩兩個景點,我們認為總評分是兩個景點的評分之和減去兩個景點之間的距離,即為a i a j i j。那麼小明選擇哪兩個景點才會總評分最大呢?輸入格式 第一行包含整數n。第二行...
位元組跳動筆試題
要求 輸入陣列長度,然後輸入陣列中的各個元素,最後輸入整數k,要求找出陣列中三個元素小於k的三個元素,例如 輸入陣列長度 6 輸入陣列元素 2 0 1 2 3 6 輸出三元組 共4個 下面給出思路和 思路 1 獲得使用者輸入的陣列長度n,若n不為整數,則提示錯誤。2 建立陣列。3 獲得使用者輸入的陣...
位元組跳動歷屆筆試題(1)
有三隻球隊,每只球隊編號分別為球隊1,球隊2,球隊3,這三隻球隊一共需要進行 n 場比賽。現在已經踢完了k場比賽,每場比賽不能打平,踢贏一場比賽得一分,輸了不得分不減分。已知球隊1和球隊2的比分相差d1分,球隊2和球隊3的比分相差d2分,每場比賽可以任意選擇兩隻隊伍進行。求如果打完最後的 n k 場...