總時間限制:
1000ms
記憶體限制:
65536kb 描述
16世紀法國外交家blaise de vigenère設計了一種多表密碼加密演算法——vigenère密碼。vigenère密碼的加密解密演算法簡單易用,且破譯難度比較高,曾在美國南北戰爭中為南軍所廣泛使用。
在密碼學中,我們稱需要加密的資訊為明文,用m表示;稱加密後的資訊為密文,用c表示;而金鑰是一種引數,是將明文轉換為密文或將密文轉換為明文的演算法中輸入的資料,記為k。在vigenère密碼中,金鑰k是乙個字母串,k=k1k2…kn。當明文m=m1m2…mn時,得到的密文c=c1c2…cn,其中ci=mi®ki,運算®的規則如下表所示:
加密在操作時需要注意:
1. ®
運算忽略參與運算的字母的大小寫,並保持字母在明文m中的大小寫形式;
2. 當明文m的長度大於金鑰k的長度時,將金鑰k重複使用。
例如,明文m=helloworld,金鑰k=abc時,密文c=hfnlpyosnd。 明文
h e
l l
o w
o r
l d
金鑰 a
b c
a b
c a
b c
a 密文
h f
n l
p y
o s
n d
輸入 輸入共2行。
第一行為乙個字串,表示金鑰k,長度不超過100,其中僅包含大小寫字母。第二行為乙個字串,表示經加密後的密文,長度不超過1000,其中僅包含大小寫字母。
對於100%的資料,輸入的金鑰的長度不超過100,輸入的密文的長度不超過1000,且都僅包含英文本母。輸出
輸出共1行,乙個字串,表示輸入金鑰和密文所對應的明文。
樣例輸入
completevictory
yvqgpxaimmklongnzfwpvxmniytm
樣例輸出
wherethereisawillthereisaway **
noip2012
複賽 提高組 第一題
題解:注意本題是由密文解密為原文。由於金鑰和密文需要進行相互運算,所以轉換大小寫是必不可少的,題目有要求原文大小寫與密文一致,所以我們可以用乙個陣列
int miwen_x[2000] 來儲存原文大小寫的資料
讀入密文、金鑰,轉換大小寫並且記錄密文的大小寫狀況
本表指 一對金鑰與原文可以加密成密文,現在要翻譯密文,也就是知道對應的點,也知道了y軸座標,求x軸座標。
1.當密文≥金鑰時,我們發現資料是依次遞增的,則此時ans[i]=miwen[i]-key[j]+'a'
2.當密文《金鑰時,資料由最右端向左依次遞減,此時ans[i]='z'-(key[j]-miwen[i]-1)
j的意義在後面。
注意這裡還有乙個易錯點,金鑰的長度可能小於密文的長度,那麼當金鑰較短時就要運用迴圈多次使用此金鑰
int j=0;
並且在每次迴圈後
j++;
if(j==strlen(key))
j=0;
最後通過miwen_x[i]的值將原文的大小寫形式恢復原樣
這樣就解決此問題了
本題總思路:
1.
讀入金鑰、密文並轉換成小寫(大寫也可),同時記錄密文的大小寫情況
2.
運用演算法算出原文
3.
通過大小寫情況恢復原文的大小寫
#include#include#include#includeint change(int i)//大小寫轉換
int main()
char ans[1200];
int j=0;
for(int i=0;i<=strlen(miwen)-1;i++)
ans[strlen(miwen)]=0;
printf("%s",ans);
return 0;
}
2012 noip提高 Vigen re 密碼
16 世紀法國外交家 blaise de vigen reblaisedevigene re 設計了一種多表密碼加密演算法 vigen revigene re 密碼。vigen revigene re 密碼的加密解密演算法簡單易用,且破譯難度比較高,曾在美國南北戰爭中為南軍所廣泛使用。在密碼學中,我...
洛谷 P1079 Vigen re 密碼
題目描述 16 世紀法國外交家 blaise de vigen re 設計了一種多表密碼加密演算法 vigen re 密 碼。vigen re 密碼的加密解密演算法簡單易用,且破譯難度比較高,曾在美國南北戰爭中為 南軍所廣泛使用。在密碼學中,我們稱需要加密的資訊為明文,用 m 表示 稱加密後的資訊為...
洛谷 P1079 Vigen re 密碼
題目描述 16 世紀法國外交家 blaise de vigen re 設計了一種多表密碼加密演算法 vigen re 密碼。vigen re 密碼的加密解密演算法簡單易用,且破譯難度比較高,曾在美國南北戰爭中為南軍所廣泛使用。在密碼學中,我們稱需要加密的資訊為明文,用 m 表示 稱加密後的資訊為密文...