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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

算法设计与分析-实验3

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

問題 A: algorithm-數(shù)據(jù)加密
[命題人 : 080063]
時(shí)間限制 : 1.000 sec 內(nèi)存限制 : 128 MB

題目描述
密碼學(xué)是研究編制密碼和破譯密碼的技術(shù)科學(xué)。研究密碼變化的客觀規(guī)律,應(yīng)用于編制密碼以保守通信秘密的,稱為編碼學(xué);應(yīng)用于破譯密碼以獲取通信情報(bào)的,稱為破譯學(xué),總稱密碼學(xué)。密碼是通信雙方按約定的法則進(jìn)行信息特殊變換的一種重要保密手段。依照這些法則,變明文為密文,稱為加密變換;變密文為明文,稱為脫密變換。密碼在早期僅對(duì)文字或數(shù)碼進(jìn)行加、脫密變換,隨著通信技術(shù)的發(fā)展,對(duì)語(yǔ)音、圖像、數(shù)據(jù)等都可實(shí)施加、脫密變換。
現(xiàn)在要求你用下面給定的方法對(duì)數(shù)據(jù)實(shí)現(xiàn)加密。給定長(zhǎng)度為n的字符串S(1<=n<=2000,S中只有大寫字母)作為明文,要求構(gòu)造一個(gè)字符串T作為密文,起初T是一個(gè)空串,之后反復(fù)執(zhí)行以下任意操作
1.從S的頭部刪除一個(gè)字符,加入到T的尾部
2.從S的尾部刪除一個(gè)字符,加入到T的尾部
最后S會(huì)變成空串,T會(huì)變成一個(gè)長(zhǎng)度為n的字符串作為密文。當(dāng)然并非所有的構(gòu)造方案都是符合條件的,我們要求構(gòu)造出的密文T的字典序盡可能小,你能找出這個(gè)字典序最小的密文嗎?
輸入
輸入包含多組數(shù)據(jù),每組數(shù)據(jù)占兩行,第一行為一個(gè)整數(shù)n(1<=n<=2000)代表字符串S的長(zhǎng)度,第二行為一個(gè)長(zhǎng)度為n的字符串S代表明文,保證S中只有大寫字母
輸出
對(duì)每組數(shù)據(jù),輸出一行字符串,代表構(gòu)造出的字典序最小的密文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-有趣的素?cái)?shù)
[命題人 : 080063]
時(shí)間限制 : 2.000 sec 內(nèi)存限制 : 128 MB

題目描述
素?cái)?shù)被廣泛地應(yīng)用于密碼學(xué)中,所謂的公鑰就是將想要傳遞的信息在編碼時(shí)加入砠數(shù),編碼之后傳給收信人,任何人收到此信息之后,若沒有此收信人所擁有的秘鑰,則在解密的過程中將會(huì)因?yàn)榉纸赓|(zhì)因數(shù)過久而無(wú)法破解信息,可見素?cái)?shù)在密碼學(xué)中的重要性。
現(xiàn)在給你n(2<=n<=16)個(gè)正整數(shù)1,2,3…n,你的任務(wù)是把這n個(gè)正整數(shù)組成一個(gè)環(huán),使得任意相鄰的兩個(gè)整數(shù)之和為一個(gè)素?cái)?shù),輸出有多少種合法方案。
輸入
多組輸入數(shù)據(jù),每組數(shù)據(jù)只有一個(gè)正整數(shù)n(2<=n<=16)代表有n個(gè)正整數(shù) 1,2,3…n
輸出
對(duì)每組數(shù)據(jù),輸出一個(gè)整數(shù),代表有多少種不同的可行方案數(shù)。
樣例輸入 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-簡(jiǎn)單的密碼
[命題人 : 080063]
時(shí)間限制 : 1.000 sec 內(nèi)存限制 : 128 MB

題目描述
密碼是按特定法則編成,用以對(duì)通信雙方的信息進(jìn)行明密變換的符號(hào)。密碼是隱蔽了真實(shí)內(nèi)容的符號(hào)序列。其實(shí)就是把用公開的、標(biāo)準(zhǔn)的信息編碼表示的信息通過一種變換手段,將其變?yōu)槌ㄐ烹p方以外其他人所不能讀懂的信息編碼,這種獨(dú)特的信息編碼就是密碼。
現(xiàn)在我們定義一種非常簡(jiǎn)單的密碼,它的長(zhǎng)度固定為n(n<=30)并且每一位只能由數(shù)字0或者數(shù)字1組成,但是有一個(gè)特殊的要求:一個(gè)密碼序列中至少要有連續(xù)的3個(gè)0出現(xiàn)才可以,否則就是無(wú)效的。現(xiàn)在給定你密碼序列的長(zhǎng)度n,你的任務(wù)是計(jì)算長(zhǎng)度為n的序列能產(chǎn)生多少種不同的并且有效的密碼?
輸入
輸入包含多組數(shù)據(jù),每組數(shù)據(jù)只有一個(gè)正整數(shù)n(1<=n<=30)代表密碼序列的長(zhǎng)度,單獨(dú)占一行。
輸出
對(duì)每組數(shù)據(jù),輸出一個(gè)整數(shù),代表長(zhǎng)度為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個(gè)0的成員) dp[i][0]=2^(i-4)-dp[i-4][0](表示當(dāng)前元素要使用,作為那三個(gè)0的一部分)//作用是去重,避免是由前面0出現(xiàn)的3個(gè)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+剪枝優(yōu)化
問題 D: algorithm-Vigenère 密碼
[命題人 : 080063]
時(shí)間限制 : 1.000 sec 內(nèi)存限制 : 128 MB

題目描述
16 世紀(jì)法國(guó)外交家 Blaise de Vigenère 設(shè)計(jì)了一種多表密碼加密算法——Vigenère 密碼。Vigenère 密碼的加密解密算法簡(jiǎn)單易用,且破譯難度比較高,曾在美國(guó)南北戰(zhàn)爭(zhēng)中為南軍所廣泛使用。
在密碼學(xué)中,我們稱需要加密的信息為明文,用 M表示;稱加密后的信息為密文,用 C表示;而密鑰是一種參數(shù),是將明文轉(zhuǎn)換為密文或?qū)⒚芪霓D(zhuǎn)換為明文的算法中輸入的數(shù)據(jù),記為 k。 在 Vigenère 密碼中,密鑰 k是一個(gè)字母串,k = k1k2…kn 。當(dāng)明文M = m1m2…mn 時(shí),得到的密文C = c1c2…cn ,其中 ci = mi ? ki,運(yùn)算 ? 的規(guī)則如下表所示:

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

輸入
第一行為一個(gè)字符串,表示密鑰 k,長(zhǎng)度不超過 100,其中僅包含大小寫字母。
第二行為一個(gè)字符串,表示經(jīng)加密后的密文,長(zhǎng)度不超過 1000,其中僅包含大小寫字母。
輸出
輸出共 1 行,一個(gè)字符串,表示輸入密鑰和密文所對(duì)應(yīng)的明文。
樣例輸入 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]
時(shí)間限制 : 1.000 sec 內(nèi)存限制 : 128 MB

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

注意這里的輸入字符串可以有其他字符,但是最后只需對(duì)字母類型的進(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的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。