日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法设计与分析-实验3

發布時間:2024/2/28 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法设计与分析-实验3 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題 A: algorithm-數據加密
[命題人 : 080063]
時間限制 : 1.000 sec 內存限制 : 128 MB

題目描述
密碼學是研究編制密碼和破譯密碼的技術科學。研究密碼變化的客觀規律,應用于編制密碼以保守通信秘密的,稱為編碼學;應用于破譯密碼以獲取通信情報的,稱為破譯學,總稱密碼學。密碼是通信雙方按約定的法則進行信息特殊變換的一種重要保密手段。依照這些法則,變明文為密文,稱為加密變換;變密文為明文,稱為脫密變換。密碼在早期僅對文字或數碼進行加、脫密變換,隨著通信技術的發展,對語音、圖像、數據等都可實施加、脫密變換。
現在要求你用下面給定的方法對數據實現加密。給定長度為n的字符串S(1<=n<=2000,S中只有大寫字母)作為明文,要求構造一個字符串T作為密文,起初T是一個空串,之后反復執行以下任意操作
1.從S的頭部刪除一個字符,加入到T的尾部
2.從S的尾部刪除一個字符,加入到T的尾部
最后S會變成空串,T會變成一個長度為n的字符串作為密文。當然并非所有的構造方案都是符合條件的,我們要求構造出的密文T的字典序盡可能小,你能找出這個字典序最小的密文嗎?
輸入
輸入包含多組數據,每組數據占兩行,第一行為一個整數n(1<=n<=2000)代表字符串S的長度,第二行為一個長度為n的字符串S代表明文,保證S中只有大寫字母
輸出
對每組數據,輸出一行字符串,代表構造出的字典序最小的密文T
樣例輸入 Copy
6
ACDBCB
樣例輸出 Copy
ABCBCD

#include<bits/stdc++.h> using namespace std; #define ll long long int n,tip,top; string s; int main() { ios::sync_with_stdio(false);while(cin>>n){cin>>s;tip=0;top=n-1;while(tip<=top){if(s[tip]<s[top]){cout<<s[tip];tip++; } else if(s[tip]>s[top]){cout<<s[top];top--;}else{int ti=tip,to=top,f=0;while(ti<=to){ti++;to--;if(s[ti]<s[to]){f=0;break; } else if(s[ti]>s[to]){f=1;break;}}if(f){cout<<s[top];top--;}else{cout<<s[tip];tip++;}}}cout<<endl;}return 0; }

問題 B: algorithm-有趣的素數
[命題人 : 080063]
時間限制 : 2.000 sec 內存限制 : 128 MB

題目描述
素數被廣泛地應用于密碼學中,所謂的公鑰就是將想要傳遞的信息在編碼時加入砠數,編碼之后傳給收信人,任何人收到此信息之后,若沒有此收信人所擁有的秘鑰,則在解密的過程中將會因為分解質因數過久而無法破解信息,可見素數在密碼學中的重要性。
現在給你n(2<=n<=16)個正整數1,2,3…n,你的任務是把這n個正整數組成一個環,使得任意相鄰的兩個整數之和為一個素數,輸出有多少種合法方案。
輸入
多組輸入數據,每組數據只有一個正整數n(2<=n<=16)代表有n個正整數 1,2,3…n
輸出
對每組數據,輸出一個整數,代表有多少種不同的可行方案數。
樣例輸入 Copy
6
8
樣例輸出 Copy
2
4

#include<iostream> #include<vector> using namespace std; int sum=0; void f(vector<vector<int> >&op,vector<int>check,int &a,int n,int start){if(n==a){sum++;return;}for(int i=2;i<=a;i++){if(op[start][i]&&check[i]==0){check[i]=1;if(n!=a-1||n==a-1&&op[1][i])f(op,check,a,n+1,i);check[i]=0;}} } int main() {int a;vector<int>res={3, 5, 7, 11, 13, 17, 19, 23, 29, 31};//最小1+2,所以不可能為2vector<int>check=vector<int>(17,0);check[1]=1;while(cin>>a){sum=0;if(a&1){cout<<0<<endl;continue;}vector<vector<int> > ans=vector<vector<int> >(a+1,vector<int>(a+1,0));for(int i:res){if(i>a*2)break;for(int j=1;j<=i/2;j++){if(i-j>a)continue;ans[j][i-j]=ans[i-j][j]=1;}}f(ans,check,a,1,1);cout<<sum<<endl;}return 0; }

問題 C: algorithm-簡單的密碼
[命題人 : 080063]
時間限制 : 1.000 sec 內存限制 : 128 MB

題目描述
密碼是按特定法則編成,用以對通信雙方的信息進行明密變換的符號。密碼是隱蔽了真實內容的符號序列。其實就是把用公開的、標準的信息編碼表示的信息通過一種變換手段,將其變為除通信雙方以外其他人所不能讀懂的信息編碼,這種獨特的信息編碼就是密碼。
現在我們定義一種非常簡單的密碼,它的長度固定為n(n<=30)并且每一位只能由數字0或者數字1組成,但是有一個特殊的要求:一個密碼序列中至少要有連續的3個0出現才可以,否則就是無效的。現在給定你密碼序列的長度n,你的任務是計算長度為n的序列能產生多少種不同的并且有效的密碼?
輸入
輸入包含多組數據,每組數據只有一個正整數n(1<=n<=30)代表密碼序列的長度,單獨占一行。
輸出
對每組數據,輸出一個整數,代表長度為n的序列能產生的不同密碼的種類數。
樣例輸入 Copy
4
5
6
樣例輸出 Copy
3
8
20
類似01背包 dp[i][1]=2*dp[i-1](當前元素用1,即當前元素不做為那3個0的成員) dp[i][0]=2^(i-4)-dp[i-4][0](表示當前元素要使用,作為那三個0的一部分)//作用是去重,避免是由前面0出現的3個0成員

#include<bits/stdc++.h> using namespace std; #define ll long long int n,f[35]={0,0,0,1}; int main() { ios::sync_with_stdio(false);for(int i=4;i<=30;i++)f[i]=2*f[i-1]+(1<<(i-4))-f[i-4];while(cin>>n)cout<<f[n]<<endl;return 0; }

法二使用dfs+剪枝優化
問題 D: algorithm-Vigenère 密碼
[命題人 : 080063]
時間限制 : 1.000 sec 內存限制 : 128 MB

題目描述
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,運算 ? 的規則如下表所示:

Vigenère 加密在操作時需要注意:
? 運算忽略參與運算的字母的大小寫,并保持字母在明文 M中的大小寫形式;
當明文 M 的長度大于密鑰 k 的長度時,將密鑰 k重復使用。 例如,明文 M=Helloworld,密鑰 k=abc時,密文 C=Hfnlpyosnd。

輸入
第一行為一個字符串,表示密鑰 k,長度不超過 100,其中僅包含大小寫字母。
第二行為一個字符串,表示經加密后的密文,長度不超過 1000,其中僅包含大小寫字母。
輸出
輸出共 1 行,一個字符串,表示輸入密鑰和密文所對應的明文。
樣例輸入 Copy
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm
樣例輸出 Copy
Wherethereisawillthereisaway

#include <stdio.h> int main() {char k[102],c[1002];int i,j;char temp;scanf("%s",k);getchar();scanf("%s",c);for(i=0,j=0;c[j]!='\0';j++){if(c[j]>='A'&&c[j]<='Z'){if(k[i]>='A'&&k[i]<='Z')temp=(c[j]-'A'-(k[i]-'A')+26)%26+'A';else temp=(c[j]-'A'-(k[i]-'a')+26)%26+'A';}else{if(k[i]>='A'&&k[i]<='Z')temp=(c[j]-'a'-(k[i]-'A')+26)%26+'a';else temp=(c[j]-'a'-(k[i]-'a')+26)%26+'a';}printf("%c",temp);i++;if(k[i]=='\0') i=0;}return 0; }

問題 E: algorithm-凱撒加密法
[命題人 : 080063]
時間限制 : 1.000 sec 內存限制 : 128 MB

題目描述
凱撒加密法,或稱愷撒加密、愷撒變換、變換加密,是一種最簡單且最廣為人知的加密技術。它是一種替換加密的技術,明文中的所有字母都在字母表上向后(或向前)按照一個固定數目進行偏移后被替換成密文。
例如,當偏移量是左移3的時候:
明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC
使用時,加密者查找明文字母表中需要加密的消息中的每一個字母所在位置,并且寫下密文字母表中對應的字母。需要解密的人則根據事先已知的密鑰反過來操作,得到原來的明文。例如:
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ
現在給定你一個字符串S(長度不會超過1000000)和一個整數k(-1000000000<=k<=1000000000),分別代表接受者收到的密文和在加密該密文時向后的偏移量,你的任務是計算出原來的明文
注意:只有字母在加密時才會發生偏移,其它字符保持不變
輸入
輸入包含多組數據,其中第一行為數據組數T(T<=10)
每組數據第一行為一個字符串S,由數字、字母以及常見字符組成(不含空格),第二行為一個整數k代表加密時向后的偏移量(|S|<=1000000,-1000000000<=k<=1000000000)
輸出
對每組數據,輸出一行字符串,代表輸入中的密文對應的明文。
樣例輸入 Copy
1
DEFGHIJKLMNOPQRSTUVWXYZABC
3
樣例輸出 Copy
ABCDEFGHIJKLMNOPQRSTUVWXYZ

注意這里的輸入字符串可以有其他字符,但是最后只需對字母類型的進行轉換

#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; }

總結

以上是生活随笔為你收集整理的算法设计与分析-实验3的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。