2015百度之星資格賽1002

2021-07-02 20:18:48 字數 2633 閱讀 4540

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#include#include#include#include#include#include#include#include#includeusing namespace std;

int main()

{ int k,cc=1;

char s[10005];

while(cin>>k)

{getchar();

gets(s);

int l=strlen(s);

for(int i=0;i比如4

這一組資料。我們可以發現前面3個本是一列,後面每兩個是一列。

為什麼是3個呢,9個數分成三行之後,第三行只有1個數。

也就是,n個數分成(n-1)/3+1行之後,最後一行只有n%k個數。

假設我們可以從1輸出到9,那麼可以發現上面這個例子的輸出位置順序是035714682。

我們把它分成三段 0357 1468 2。

可以看到0跟3差3,1跟4差3,而其他的都是差2。

那麼可以想到當數字位置在(n/k+1)*(n%k)內時,它的步長為n/k+1,不在這個範圍內時,步長為n/k。

那麼,寫兩層迴圈直接列印就好。

int n=l/k,cnt=0;

int m=(l/k+1)*(l%k);

for(i=0;i<(l-1)/k+1;i++)

{    for(j=i;j

#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define re(x) freopen(x,"r",stdin);

#define wr(x) freopen(x,"w",stdout);

int main()

{ int k,t;

char s[100005];

scanf("%d",&t);

for(int cc=1;cc<=t;cc++)

{getchar();

gets(s);

scanf("%d",&k);

int l=strlen(s);

int i,j,cnt=0;

printf("case #%d:\n",cc);

int n=l/k;

int m=(l/k+1)*(l%k);

for(i=0;i<(l-1)/k+1;i++)

{for(j=i;j

2015百度之星資格賽1002

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

2015百度之星資格賽1001

題目名稱 大搬家 problem description 近期b廠組織了一次大搬家,所有人都要按照指示換到指定的座位上。指示的內容是坐在位置 i 上的人要搬到位置 j 上。現在b廠有 n 個人,一對一到 n 個位置上。搬家之後也是一一對應的,改變的只有位次。在第一次搬家後,度度熊由於疏忽,又要求大家...

2015百度之星資格賽1004

題目名稱 放盤子 problem description 小度熊喜歡惡作劇。今天他向來訪者們提出乙個惡俗的遊戲。他和來訪者們輪流往乙個正多邊形內放盤子。最後放盤子的是獲勝者,會贏得失敗者的乙個吻。玩了兩次以後,小度熊發現來訪者們都知道遊戲的必勝策略。現在小度熊永遠是先手,他想知道他是否能獲勝。注意盤...