信息学奥赛一本通 1855:【09NOIP提高组】潜伏者 | OpenJudge NOI 1.7 11:潜伏者 | 洛谷 P1071 [NOIP2009 提高组] 潜伏者
【題目鏈接】
ybt 1855:【09NOIP提高組】潛伏者
OpenJudge NOI 1.7 11:潛伏者
洛谷 P1071 [NOIP2009 提高組] 潛伏者
【題目考點(diǎn)】
1. 字符串
2. ASCII碼
【解題思路】
因為題中指明了:每個字母只對應(yīng)一個唯一的“密字”,不同的字母對應(yīng)不同的“密字”。因此明文字母和密文字母為一一對應(yīng)的關(guān)系。
設(shè)數(shù)組ori與enc,初值都為’\0’。ori[i]指密文字母i對應(yīng)的明文字母,enc[i]指明文字母i對應(yīng)的密文字母。每找到新的一對對應(yīng)關(guān)系:明文A對應(yīng)密文B,則需要先檢查明文A是否已經(jīng)有對應(yīng)的密文字母(enc[A]是否不為’\0’),以及密文B是否有對應(yīng)的明文字母(ori[B]是否不為’\0’)。
- 如果二者都沒有對應(yīng)的字母,那么建立明文A與密文B的對應(yīng)關(guān)系,讓enc[A] = B,ori[B] = A。每建立一對關(guān)系,做一次計數(shù)。
- 如果A或B已經(jīng)存在與其對應(yīng)的字母,而且對應(yīng)關(guān)系不為“明文A對應(yīng)密文B”,那么輸出Failed。
由于題目中有要求:如果發(fā)現(xiàn)存在某個(或某些)字母在原信息中沒有出現(xiàn),則破譯失敗。所以每個密文字母都要有與其對應(yīng)的明文字母,對應(yīng)關(guān)系數(shù)量必須得等于26。
最后統(tǒng)計關(guān)系數(shù)量,如果達(dá)到26,則使用已經(jīng)構(gòu)建好的明文密文關(guān)系做字符串解密。如果關(guān)系數(shù)量小于26,則輸出Fail。
【題解代碼】
解法1:
#include<bits/stdc++.h> using namespace std; #define N 105 int main() {char s_e[N], s_o[N], s_n[N];//s_e:加密后字符串 s_o:原字符串 s_n:待加密字符串char ori[128] = {}, enc[128] = {};//ori[i]:ASCII碼為i的加密字符的原字符 enc[i]:ASCII碼為i的原字符對應(yīng)的加密字符 初值都為'\0'cin >> s_e >> s_o >> s_n;int l1 = strlen(s_e), l2 = strlen(s_n), cn = 0;//cn:已經(jīng)確定的加密關(guān)系的個數(shù)for(int i = 0; i < l1; ++i){if(ori[s_e[i]] == '\0' && enc[s_o[i]] == '\0')//如果不存在s_e[i]對應(yīng)的明文,同時不存在s_o[i]對應(yīng)的密文 {//建立對應(yīng)關(guān)系:明文s_o[i]對應(yīng)密文s_e[i] ori[s_e[i]] = s_o[i];enc[s_o[i]] = s_e[i];cn++;}else if(ori[s_e[i]] != s_o[i] || enc[s_o[i]] != s_e[i])//如果已有對應(yīng)關(guān)系,且對應(yīng)關(guān)系不為明文s_o[i]對應(yīng)密文s_e[i] {cout << "Failed";return 0;}}if(cn != 26)//如果對應(yīng)關(guān)系不足26對 {cout << "Failed";return 0;}for(int i = 0; i < l2; i++)//解密s_n字符串 cout << ori[s_n[i]];return 0; }總結(jié)
以上是生活随笔為你收集整理的信息学奥赛一本通 1855:【09NOIP提高组】潜伏者 | OpenJudge NOI 1.7 11:潜伏者 | 洛谷 P1071 [NOIP2009 提高组] 潜伏者的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言密码程序返回,想程序高手求助--用
- 下一篇: 源码编译mysql5.5_源码编译安装M