百度之星資格賽 1002 列變位法解密

2021-07-02 19:26:43 字數 1707 閱讀 5155

problem description

列變位法是古典密碼演算法中變位加密的一種方法,具體過程如下 將明文本元分割成個數固定的分組(如5個一組,5即為金鑰),按一組一行的次序整齊排列,最後不足一組不放置任何字元,完成後按列讀取即成密文。

比如:原文:123456789

金鑰:4

變換後的矩陣:

1234

5678

9***

(最後的幾個x表示無任何字元,不是空格,不是製表符,就沒有任何字元,下同)

密文:159263748

再比如:

原文:hello, welcome to my dream world!

金鑰:7

變換後的矩陣:

hello,

welcome

to my

dream w

orld!xx

密文:hw doeetrrlloellc adoomm!,my e w

實現乙個利用列變位法的加密器對bob來說輕而易舉,可是,對bob來說,想清楚如何寫乙個相應的解密器似乎有點困難,你能幫幫他嗎?

input

第一行乙個整數

t ,表示

t 組資料。

每組資料報含

2 行

第一行,乙個字串s(

1≤|s

|≤1e

5),表示經過列變位法加密後的密文

第二行,乙個整數k(

1≤k≤

|s|)

,表示原文在使用列變位法加密時的金鑰

輸入保證密文字串中只含有ascii碼在[0

x20,0

x7f)

範圍內的字元

output

對於每組資料,先輸出一行

case #i:

然後輸出一行,包含乙個字串s_decrypt,表示解密後得到的明文

sample input

4

159263748

4hw doeetrrlloellc adoomm!,my e w

7toodming is best

16sokaisan

1

sample output

case #1:

123456789

case #2:

hello, welcome to my dream world!

case #3:

toodming is best

case #4:

sokaisan

#include#include#includeint main()

; int k, roww, row=0, col, colremain;

gets(str);

int str_len = strlen(str);

scanf("%d", &k);

getchar();

roww = str_len / k;

if(str_len % k) row =roww + 1;

else row = roww;

col = str_len % k;

colremain = k - col;

for(int i=1; i<= row; ++i)

for(int j=1; j

2015百度之星資格賽1002

problem description 列變位法是古典密碼演算法中變位加密的一種方法,具體過程如下 將明文本元分割成個數固定的分組 如5個一組,5即為金鑰 按一組一行的次序整齊排列,最後不足一組不放置任何字元,完成後按列讀取即成密文。比如 原文 123456789 金鑰 4 變換後的矩陣 1234 ...

2015百度之星資格賽1002

題目名稱 列變位法解密 problem description 列變位法是古典密碼演算法中變位加密的一種方法,具體過程如下 將明文本元分割成個數固定的分組 如5個一組,5即為金鑰 按一組一行的次序整齊排列,最後不足一組不放置任何字元 完成後按列讀取即成密文。比如 原文 123456789 金鑰 4 ...

百度之星資格賽

1001 給你1 n這n個數字,公升序排列,接下來按照陣列a進行位置變換,a i 代表第i個數字會變到a i 位置上,a中的數字也是從1 n。現在問有多少個不同的陣列能滿足做一次變換和做三次變換結果相同。我們可以這樣分析,x y是唯一的到y的途徑,假設x y為第一次變換,因此在第三次變換的時候任然為...