算法设计与分析-实验3
問題 A: algorithm-數(shù)據(jù)加密
[命題人 : 080063]
時間限制 : 1.000 sec 內(nèi)存限制 : 128 MB
題目描述
密碼學(xué)是研究編制密碼和破譯密碼的技術(shù)科學(xué)。研究密碼變化的客觀規(guī)律,應(yīng)用于編制密碼以保守通信秘密的,稱為編碼學(xué);應(yīng)用于破譯密碼以獲取通信情報的,稱為破譯學(xué),總稱密碼學(xué)。密碼是通信雙方按約定的法則進(jìn)行信息特殊變換的一種重要保密手段。依照這些法則,變明文為密文,稱為加密變換;變密文為明文,稱為脫密變換。密碼在早期僅對文字或數(shù)碼進(jìn)行加、脫密變換,隨著通信技術(shù)的發(fā)展,對語音、圖像、數(shù)據(jù)等都可實施加、脫密變換。
現(xiàn)在要求你用下面給定的方法對數(shù)據(jù)實現(xiàn)加密。給定長度為n的字符串S(1<=n<=2000,S中只有大寫字母)作為明文,要求構(gòu)造一個字符串T作為密文,起初T是一個空串,之后反復(fù)執(zhí)行以下任意操作
1.從S的頭部刪除一個字符,加入到T的尾部
2.從S的尾部刪除一個字符,加入到T的尾部
最后S會變成空串,T會變成一個長度為n的字符串作為密文。當(dāng)然并非所有的構(gòu)造方案都是符合條件的,我們要求構(gòu)造出的密文T的字典序盡可能小,你能找出這個字典序最小的密文嗎?
輸入
輸入包含多組數(shù)據(jù),每組數(shù)據(jù)占兩行,第一行為一個整數(shù)n(1<=n<=2000)代表字符串S的長度,第二行為一個長度為n的字符串S代表明文,保證S中只有大寫字母
輸出
對每組數(shù)據(jù),輸出一行字符串,代表構(gòu)造出的字典序最小的密文T
樣例輸入 Copy
6
ACDBCB
樣例輸出 Copy
ABCBCD
問題 B: algorithm-有趣的素數(shù)
[命題人 : 080063]
時間限制 : 2.000 sec 內(nèi)存限制 : 128 MB
題目描述
素數(shù)被廣泛地應(yīng)用于密碼學(xué)中,所謂的公鑰就是將想要傳遞的信息在編碼時加入砠數(shù),編碼之后傳給收信人,任何人收到此信息之后,若沒有此收信人所擁有的秘鑰,則在解密的過程中將會因為分解質(zhì)因數(shù)過久而無法破解信息,可見素數(shù)在密碼學(xué)中的重要性。
現(xiàn)在給你n(2<=n<=16)個正整數(shù)1,2,3…n,你的任務(wù)是把這n個正整數(shù)組成一個環(huán),使得任意相鄰的兩個整數(shù)之和為一個素數(shù),輸出有多少種合法方案。
輸入
多組輸入數(shù)據(jù),每組數(shù)據(jù)只有一個正整數(shù)n(2<=n<=16)代表有n個正整數(shù) 1,2,3…n
輸出
對每組數(shù)據(jù),輸出一個整數(shù),代表有多少種不同的可行方案數(shù)。
樣例輸入 Copy
6
8
樣例輸出 Copy
2
4
問題 C: algorithm-簡單的密碼
[命題人 : 080063]
時間限制 : 1.000 sec 內(nèi)存限制 : 128 MB
題目描述
密碼是按特定法則編成,用以對通信雙方的信息進(jìn)行明密變換的符號。密碼是隱蔽了真實內(nèi)容的符號序列。其實就是把用公開的、標(biāo)準(zhǔn)的信息編碼表示的信息通過一種變換手段,將其變?yōu)槌ㄐ烹p方以外其他人所不能讀懂的信息編碼,這種獨(dú)特的信息編碼就是密碼。
現(xiàn)在我們定義一種非常簡單的密碼,它的長度固定為n(n<=30)并且每一位只能由數(shù)字0或者數(shù)字1組成,但是有一個特殊的要求:一個密碼序列中至少要有連續(xù)的3個0出現(xiàn)才可以,否則就是無效的。現(xiàn)在給定你密碼序列的長度n,你的任務(wù)是計算長度為n的序列能產(chǎn)生多少種不同的并且有效的密碼?
輸入
輸入包含多組數(shù)據(jù),每組數(shù)據(jù)只有一個正整數(shù)n(1<=n<=30)代表密碼序列的長度,單獨(dú)占一行。
輸出
對每組數(shù)據(jù),輸出一個整數(shù),代表長度為n的序列能產(chǎn)生的不同密碼的種類數(shù)。
樣例輸入 Copy
4
5
6
樣例輸出 Copy
3
8
20
類似01背包 dp[i][1]=2*dp[i-1](當(dāng)前元素用1,即當(dāng)前元素不做為那3個0的成員) dp[i][0]=2^(i-4)-dp[i-4][0](表示當(dāng)前元素要使用,作為那三個0的一部分)//作用是去重,避免是由前面0出現(xiàn)的3個0成員
法二使用dfs+剪枝優(yōu)化
問題 D: algorithm-Vigenère 密碼
[命題人 : 080063]
時間限制 : 1.000 sec 內(nèi)存限制 : 128 MB
題目描述
16 世紀(jì)法國外交家 Blaise de Vigenère 設(shè)計了一種多表密碼加密算法——Vigenère 密碼。Vigenère 密碼的加密解密算法簡單易用,且破譯難度比較高,曾在美國南北戰(zhàn)爭中為南軍所廣泛使用。
在密碼學(xué)中,我們稱需要加密的信息為明文,用 M表示;稱加密后的信息為密文,用 C表示;而密鑰是一種參數(shù),是將明文轉(zhuǎn)換為密文或?qū)⒚芪霓D(zhuǎn)換為明文的算法中輸入的數(shù)據(jù),記為 k。 在 Vigenère 密碼中,密鑰 k是一個字母串,k = k1k2…kn 。當(dāng)明文M = m1m2…mn 時,得到的密文C = c1c2…cn ,其中 ci = mi ? ki,運(yùn)算 ? 的規(guī)則如下表所示:
Vigenère 加密在操作時需要注意:
? 運(yùn)算忽略參與運(yùn)算的字母的大小寫,并保持字母在明文 M中的大小寫形式;
當(dāng)明文 M 的長度大于密鑰 k 的長度時,將密鑰 k重復(fù)使用。 例如,明文 M=Helloworld,密鑰 k=abc時,密文 C=Hfnlpyosnd。
輸入
第一行為一個字符串,表示密鑰 k,長度不超過 100,其中僅包含大小寫字母。
第二行為一個字符串,表示經(jīng)加密后的密文,長度不超過 1000,其中僅包含大小寫字母。
輸出
輸出共 1 行,一個字符串,表示輸入密鑰和密文所對應(yīng)的明文。
樣例輸入 Copy
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm
樣例輸出 Copy
Wherethereisawillthereisaway
問題 E: algorithm-凱撒加密法
[命題人 : 080063]
時間限制 : 1.000 sec 內(nèi)存限制 : 128 MB
題目描述
凱撒加密法,或稱愷撒加密、愷撒變換、變換加密,是一種最簡單且最廣為人知的加密技術(shù)。它是一種替換加密的技術(shù),明文中的所有字母都在字母表上向后(或向前)按照一個固定數(shù)目進(jìn)行偏移后被替換成密文。
例如,當(dāng)偏移量是左移3的時候:
明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC
使用時,加密者查找明文字母表中需要加密的消息中的每一個字母所在位置,并且寫下密文字母表中對應(yīng)的字母。需要解密的人則根據(jù)事先已知的密鑰反過來操作,得到原來的明文。例如:
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ
現(xiàn)在給定你一個字符串S(長度不會超過1000000)和一個整數(shù)k(-1000000000<=k<=1000000000),分別代表接受者收到的密文和在加密該密文時向后的偏移量,你的任務(wù)是計算出原來的明文
注意:只有字母在加密時才會發(fā)生偏移,其它字符保持不變
輸入
輸入包含多組數(shù)據(jù),其中第一行為數(shù)據(jù)組數(shù)T(T<=10)
每組數(shù)據(jù)第一行為一個字符串S,由數(shù)字、字母以及常見字符組成(不含空格),第二行為一個整數(shù)k代表加密時向后的偏移量(|S|<=1000000,-1000000000<=k<=1000000000)
輸出
對每組數(shù)據(jù),輸出一行字符串,代表輸入中的密文對應(yīng)的明文。
樣例輸入 Copy
1
DEFGHIJKLMNOPQRSTUVWXYZABC
3
樣例輸出 Copy
ABCDEFGHIJKLMNOPQRSTUVWXYZ
注意這里的輸入字符串可以有其他字符,但是最后只需對字母類型的進(jìn)行轉(zhuǎn)換
#include<bits/stdc++.h> using namespace std; #define ll long long string str[15]; int t,off[15]; int main() {cin >> t;for(int i = 0; i < t; i++){cin >> str[i];cin >> off[i];off[i]%=26;}for(int i = 0; i < t; i++){for(int j = 0; j < str[i].length(); j++){if(str[i][j] >= 'A' && str[i][j] <= 'Z')str[i][j] = 'A' + (str[i][j] - 'A' - off[i] + 26) % 26;else if(str[i][j] >= 'a' && str[i][j] <= 'z')str[i][j] = 'a' + (str[i][j] - 'a' - off[i] + 26) % 26;}cout<< str[i] << endl;}return 0; }總結(jié)
以上是生活随笔為你收集整理的算法设计与分析-实验3的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法设计与分析-实验2
- 下一篇: spark实验遇到的问题