洛谷----P1079 Vigenère 密碼(知識點學習)
舊人舊事更值得懷念,或悲或喜每個人身上都承載著某一段時光,但是我會永遠清澈永遠瘋狂永遠浪漫。沒有人能回到過去重新活過,但你我都可以從現在開始,決定我們未來的模樣。
----喻言
題目描述
16 世紀法國外交家 Blaise de Vigenère 設計了一種多表密碼加密演算法 Vigenère 密碼。Vigenère 密碼的加密解密演算法簡單易用,且破譯難度比較高,曾在美國南北戰爭中為南軍所廣泛使用。
在密碼學中,我們稱需要加密的資訊為明文,用 MM 表示;稱加密後的資訊為密文,用 CC 表示;而金鑰是一種引數,是將明文轉換為密文或將密文轉換為明文的演算法中輸入的資料,記為 kk。 在 Vigenère 密碼中,金鑰 kk 是一個字母串,k=k_1,k_2,…,k_nk=k1,k2,…,kn。當明文 M=m_1,m_2,…,m_nM=m1,m2,…,mn 時,得到的密文 C=c_1,c_2,…,c_nC=c1,c2,…,cn,其中 c_ici=m_imi®k_iki,運算®的規則如下表所示:
Vigenère 加密在操作時需要注意:
-
®運算忽略參與運算的字母的大小寫,並保持字母在明文 MM 中的大小寫形式;
-
當明文 MM 的長度大於金鑰 kk 的長度時,將金鑰 kk 重複使用。
例如,明文 M=\texttt{Helloworld}M=Helloworld,金鑰 k=\texttt{abc}k=abc 時,密文 C=\texttt{Hfnlpyosnd}C=Hfnlpyosnd。
輸入格式
共 2 行。
第一行為一個字串,表示金鑰 kk,長度不超過 100100,其中僅包含大小寫字母。
第二行為一個字串,表示經加密後的密文,長度不超過 10001000,其中僅包含大小寫字母。
輸出格式
一個字串,表示輸入金鑰和密文所對應的明文。
輸入輸出樣例
輸入 #1複製
CompleteVictory Yvqgpxaimmklongnzfwpvxmniytm
輸出 #1複製
Wherethereisawillthereisaway
說明/提示
對於 100% 的資料,輸入的金鑰的長度不超過100,輸入的密文的長度不超過 1000,且都僅包含英文字母。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <complex>
#include <iomanip>
#include <numeric>
#include<unordered_set>
#include <climits>//INT_100010n
#include <regex>
//#include<bits/stdc++.h>
#define PP pair<ll,int>
#define inf 0x3f3f3f3f
#define INF 0x7fffffff;
#define llinf 0x3f3f3f3f3f3f3f3fll
#define dinf 1000000000000.0
#define PI 3.1415926
#define LL unsigned int
#define mod 1000000007
#define wc 1e-18
typedef long long ll;
using namespace std;
string k,c;
int main()
{
cin>>k>>c;
for (int i=0; i<c.length(); i++)
{
//x&31(11111B)的值就是x在字母表裡的順序。
int t=(k[i%k.length()]&31)-1;
c[i]=(c[i]&31)-t>0?c[i]-t:c[i]-t+26;
}
cout<<c<<endl;
return 0;
}
相關文章
- 洛谷網校學習
- 洛谷T90444 密碼 題解密碼
- 洛谷P1481 魔族密碼(LIS)密碼
- 密碼學入門知識密碼學
- 簡單小結密碼學入門知識點密碼學
- 洛谷-P2178 學習筆記筆記
- MyBatis知識點學習MyBatis
- Java知識點學習Java
- oracle密碼幾點基礎知識Oracle密碼
- Bootstrap 個人學習知識點boot
- jQuery 個人學習知識點jQuery
- 學習記錄 -- 知識點
- java知識點學習圖Java
- 洛谷
- 洛谷知識點——C++ 11 實現一次性輸出多行文字C++
- JS 學習個人知識盲點JS
- Vue學習知識點總結Vue
- jquery學習之重要知識點jQuery
- OpenSSL 入門:密碼學基礎知識密碼學
- C++學習筆記,知識點+程式碼測試C++筆記
- PG知識點學習總結圖
- 【java學習】java知識點總結Java
- React學習筆記知識點整理React筆記
- 機器學習vs深度學習及其知識點機器學習深度學習
- R學習-知識點記錄(Temp)
- JVM重要知識點整理和學習JVM
- 大資料學習,涉及的知識點大資料
- ES6新手學習知識點整理
- 學習 Laravel 必須理解的知識點Laravel
- 【Go學習】Go(Golang)知識點總結Golang
- Python高階知識點學習(五)Python
- Html標籤知識點學習筆記HTML筆記
- python學習-知識點記錄(Temp)Python
- 學習android所需Java知識點列表AndroidJava
- 洛谷團隊
- HTML5學習重點知識:JavaScript概述HTMLJavaScript
- Promise學習筆記(知識點 + 手寫Promise)Promise筆記
- OpenGL ES 2.0學習(一)入門知識點