題目大意是,給定一串密匙,求原始碼經過密匙加密k次後的內容。加密的規則是:原始碼第i個字母調換到密匙中ai指定的位置。同時,原始碼長度小於等於密匙長度,當原始碼長度小於密匙長度時,在原始碼後使用空格填充保證二者長度相等。
最開始使用的直接模擬加密過程的方法,會超時。明顯要考慮加密過程中加密的內容週期問題,於是直接求了整個原始碼字串的週期,這樣也會超時。實際上,密匙長度在題目中限制為最大200,直接求整個字串的週期,這個值也可能很大。參考了其它同學的思路,分開求每個字元的週期,然後對每個字元進行加密。
怎樣求每個字元的週期開始也不懂,後面才逐漸明白。對於字串中單獨乙個字元,記錄其加密過程**現的位置,當該字元再次出現在最開始的位置就認為遍歷了乙個週期。如果直接模擬加密過程,可能關注的地方在一次加密後哪個字元出現在第乙個位置,求每個字元週期過程則關注加密後原字串第乙個字元出現在什麼位置。
還有乙個耽誤了時間的地方是怎樣讀入帶有空格的字串。使用的方法是:cin.getline(char *,int),需要注意的是,題目的輸入中原始碼字串前還有乙個空格。因此,在cin.getline(char *,int)前加上cin.get()讀入該空格。
**如下:
在這裡插入**片
#include
#include
using
namespace std;
void
get_cycle
(int
*a,int
*a_cycle,
int blocks)
for(
int i=
1;i<=blocks;i++)}
}int
main()
}char trans_p[
210]
;for
(int i=
0;i)for
(int i=
0;i) cout<; cout>encode_times;
} cin>>blocks;
cout<}return0;
}
參考: POJ 1026 Cipher(置換群)迴圈節
bod 和 alice 計畫使用一種全新的編碼方案,令人驚訝的是這不是乙個公開的公匙密碼,但是他們的編碼基於密匙,在 philadelphia on february 16th他們的會議中選擇了密匙,他們選擇的密匙是乙個兩兩不等的整數序列,a1.an,大於0並且小於等於n,編碼基於一下原則。下面的資...
POJ 1026 Cipher 置換群的冪
題目大意 給出乙個置換群,再給出數個字串,每個字串需要輸出執行 k 次置換群後的答案 題目分析 置換群的 k 次冪,直接寫就行了 include include include include include include include include include include inclu...
加密問題詳解
一 對稱加密 symmetric cryptography 對稱加密是最快速 最簡單的一種加密方式,加密 encryption 與解密 decryption 用的是同樣的金鑰 secret key 這種方法在密碼學中叫做對稱加密演算法。對稱加密有很多種演算法,由於它效率很高,所以被廣泛使用在很多加密...